.listen比ref.watch更适合在doreset函数中使用(图)

我认为 ref.listen 比 ref.watch 更适合用于 doreset 函数。

与 ref.watch 类似,ref.listen 可用于监听提供者。

它们之间的主要区别在于,如果侦听提供程序发生变化,使用 ref.listen 将调用自定义函数,而不是重新构建小部件/提供程序。

根据 Riverpod 文档

ref.listen 方法有两个位置参数,第一个是Provider,第二个是我们想要在状态变化时执行的回调函数

图片[1]-.listen比ref.watch更适合在doreset函数中使用(图)-唐朝资源网

回调函数调用时,会传入两个值,前一个State的值和新State的值。

&

如您所见,在小部件中侦听 FutureProvider 会返回一个 AsyncValue – 它允许处理错误/加载状态。

在实践中

doreset 函数

我选择只处理数据情况下的 AsyncValue。

final doReset = Provider(
  (ref) {
    final done = ref.listen<AsyncValue>(doneProvider, (previousState, state) {
      state.whenData((value) {

图片[2]-.listen比ref.watch更适合在doreset函数中使用(图)-唐朝资源网

if (value) {ref.read(randomAdderProvider.notifier).reset();} }); }); }, );

图片[3]-.listen比ref.watch更适合在doreset函数中使用(图)-唐朝资源网

不要忘记在 Home Widget 的 build 方法中检查 doReset/doneProvider。否则,两者都不会启动(对此行为没有解释)

class Home extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {

    ref.watch(doReset);
    ...

最后,你的随机函数永远不会满足你设置为 delay>4 的条件,因为最大可能的延迟是 4。尝试使用 delay>3 或 delay=4。

该按钮也可能被禁用以防止在等待更新时点击

© 版权声明
THE END
喜欢就支持一下吧
点赞130赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容