Flutter Riverpod 提供者问题 - 什么情况会触发放置在基本提供者上的 "watch"? (提供代码参考)

Flutter Riverpod provider question - what situation would trigger a "watch" placed on a basic Provider? (code ref provided)

对于 Flutter 中的 Riverpod,什么情况实际上会触发放置在基本提供者(即不是 StateNotifier 提供者)上的“手表”的更新。例如在下面这种情况下:

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 会有效 rebuilt/refreshed??

A 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 的东西也会更新