【问题标题】:Flutter Riverpod provider question - what situation would trigger a "watch" placed on a basic Provider? (code ref provided)Flutter Riverpod 提供者问题 - 什么情况会触发放置在基本提供者上的“监视”? (提供代码参考)
【发布时间】:2021-11-20 23:55:07
【问题描述】:

在 Flutter 中使用 Riverpod,什么情况下实际上会触发仅放置在基本 Provider(即不是 StateNotifier Provider)上的“watch”的更新。比如下面这种情况:

final todosDatabaseProvider = Provider<TodosDatabase>((_) => TodosDatabaseImpl());

final todosRepositoryProvider =
    Provider<TodosRepository>((ref) => TodosRepositoryImpl(ref.watch(todosDatabaseProvider)));

这里来自 github 项目:https://github.com/okaryo/CleanArchitectureTodoAppTrainingWithFlutter/blob/master/lib/data/data_module.dart

那么来自 TodosDatabaseImpl 实例的实际更新会触发对 todosRepositoryProvider 的“监视”类型更新?如果发生这种情况, todosRepositoryProvider 会像有效地重建/刷新一样吗??

【问题讨论】:

    标签: flutter riverpod


    【解决方案1】:

    Provider 可能会导致其依赖项通过以下任一方式重建:

    • 在该提供商上调用ref.refresh

      final provider = Provider((ref) => 0);
      final dependent = SomeProvider((ref) => ref.watch(provider));
      
      ...
      Consumer(
        builder: (context, ref, _) {
         return SomeButton(
           onPressed: () => ref.refresh(provider),
         );
        }
      )
      
    • 如果那个Provider也在使用ref.watch,比如:

      final provider = Provider((ref) {
        ref.watch(anotherProvider);
        return Something();
      });
      

      在这种情况下,当anotherProvider 发出更新时,provider 将更新,然后观看 provider 的内容也会更新

    【讨论】:

    • 谢谢@Rémi - 在这个(在我的问题中)如何用于访问存储库层的上下文中怎么样?我的意思是我想知道在这种使用场景中:(a)todosDatabaseProvider 和 TodosDatabaseImpl 不太可能需要触发/发出更新? (b) TodosDatabaseImpl 需要执行什么代码来触发 todosDatabaseProvider 发出更新? (c) 如果我是正确的,这是否意味着 todosRepositoryProvider 可以使用“读取”而不是“观看”? [所以这些问题是一个基本的提供者......对于 StateNotifierProvider 这对我来说更有意义]
    猜你喜欢
    • 2022-06-24
    • 2022-11-11
    • 2022-01-12
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 2020-01-30
    • 2021-06-09
    相关资源
    最近更新 更多