FutureProvider 使用 .whenData() 简写

问题描述

Riverpod 使用 .whenData() 提供了一种速记,您无需提供加载和错误参数。但是我找不到此代码如何用于在 build() 函数中返回小部件的示例。

     Widget build(BuildContext context,ScopedReader watch) {
          final cityListFuture = watch(cityListFutureProvider);
          // This one is working fine
          return cityListFuture.when(
              data: (value) {
                return Text("Data goes here");
              },loading: () => CircularProgressIndicator(),error: (error,stack) {
                return Container();
              });
     
          // This is shorthand for .when() without the need of loading and error
          // ERROR: The return type 'AsyncValue<Text>' isn't a 'Widget',as required by the closure's context.
          return cityListFuture.whenData((value) => Text("Data goes here"));
     }

有谁知道我们如何使用 .whenData() 返回一个小部件?

解决方法

为此我必须阅读一个非常有趣的文档。

看起来 whenData 可能不是它应该做的。

因为它所做的只是返回一个 AsyncValue<Widget>,而不是像 Widget 函数那样直接返回 when

所以使用它的一种方法是,

return cityListFuture.whenData((val) => Text(val)).data!.value;

在这里,value 将是您的 Text(value) 本身。

这里需要注意的一件事是 ! 符号,因为 data 可以为空。因此,您必须手动进行 if 检查。

这里要注意的另一件事是,你也可以用这样的东西来达到同样的目的,

return Text(watch(cityListFutureProvider).data?.value);

假设您的 value 是一个字符串。