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