FutureProvider 使用 .whenData() shorthand

FutureProvider using .whenData() shorthand

Riverpod 提供了一个 shorthand 使用 .whenData() 的方法,您无需提供加载和错误参数。但是我找不到关于此代码如何用于 return 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() 来 return 小部件吗?

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

似乎 whenData 听起来可能并不完全像它应该做的那样。

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

所以一种使用方法是,

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

在这里,value 就是你的 Text(value) 本身。

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

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

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

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