riverpod-refs
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseRiverpod — Refs
Riverpod — Refs
Instructions
说明
Ref (and WidgetRef in widgets) is how you interact with providers: read state, listen to changes, reset state, and register lifecycle callbacks. Providers get a as the first parameter of their function or as in a Notifier. Widgets get a WidgetRef via Consumer / ConsumerWidget / ConsumerState.
Refthis.refRef(以及widget中的WidgetRef)是你与providers交互的方式:读取状态、监听变化、重置状态,以及注册生命周期回调。Providers会在其函数的第一个参数中获得,或者在Notifier中通过获取。Widgets则通过Consumer / ConsumerWidget / ConsumerState获取WidgetRef。
Refthis.refObtaining a Ref
获取Ref
- Inside a provider: First parameter of the provider function, or property in a Notifier.
ref - Inside a widget: Use a Consumer (builder gives ), ConsumerWidget (
ref), or ConsumerStatefulWidget (state hasbuild(context, ref)). Passrefto other functions if needed.ref
- 在provider内部: provider函数的第一个参数,或者Notifier中的属性。
ref - 在widget内部: 使用Consumer(builder会提供)、ConsumerWidget(
ref)或ConsumerStatefulWidget(state包含build(context, ref))。如有需要,可将ref传递给其他函数。ref
Listening to state
监听状态
- ref.watch(provider) — Declarative. Your widget/provider rebuilds when the provider changes. Use this by default in build methods.
- ref.listen(provider, (prev, next) { ... }) — Imperative. Run side effects when the provider changes (e.g. show a dialog, navigate). Safe to use in build; for initState use and manage the subscription.
ref.listenManual
dart
// In a widget
final tick = ref.watch(tickProvider);
return Text('Tick: $tick');
// Side effect when provider changes
ref.listen(tickProvider, (previous, next) {
print('Tick changed from $previous to $next');
});- ref.watch(provider) — 声明式。当provider发生变化时,你的widget/provider会重建。默认在build方法中使用此方式。
- ref.listen(provider, (prev, next) { ... }) — 命令式。当provider变化时执行副作用(例如显示弹窗、页面导航)。可安全用于build方法;若在initState中使用,需用并管理订阅。
ref.listenManual
dart
// 在widget中
final tick = ref.watch(tickProvider);
return Text('Tick: $tick');
// 当provider变化时执行副作用
ref.listen(tickProvider, (previous, next) {
print('Tick changed from $previous to $next');
});Reading without listening
读取状态但不监听
- ref.read(provider) — Get current value without subscribing. Use in event handlers (e.g. onPressed), not to "optimize" by avoiding watch. For selective rebuilds use .
ref.watch(provider.select((value) => ...))
dart
onPressed: () {
final tick = ref.read(tickProvider);
print('Current tick: $tick');
}- ref.read(provider) — 获取当前值但不订阅。用于事件处理器(例如onPressed),不要为了“优化”而避免使用watch。如需选择性重建,请使用。
ref.watch(provider.select((value) => ...))
dart
onPressed: () {
final tick = ref.read(tickProvider);
print('Current tick: $tick');
}Resetting state
重置状态
- ref.invalidate(provider) — Discard current state; provider will recompute on next read. If the provider is listened to, a new state is created.
- ref.refresh(provider) — Same as invalidate + read: invalidates and returns the new value. Use when you need the new value immediately.
dart
ref.invalidate(tickProvider);
// or
final newTick = ref.refresh(tickProvider);- ref.invalidate(provider) — 丢弃当前状态;provider会在下次读取时重新计算。如果provider被监听,会创建新的状态。
- ref.refresh(provider) — 等同于invalidate + read:失效并返回新值。当你需要立即获取新值时使用。
dart
ref.invalidate(tickProvider);
// 或者
final newTick = ref.refresh(tickProvider);Lifecycle: onDispose, onCancel
生命周期:onDispose、onCancel
Inside a provider you can register callbacks:
- ref.onDispose(callback) — Called when the provider state is destroyed (e.g. auto-dispose or recomputation). Use to close StreamControllers, cancel timers, etc. Do not trigger side effects that modify other providers inside onDispose.
- ref.onCancel(callback) — Called when the last listener is removed (before dispose). ref.onResume(callback) — Called when a listener is added again after onCancel.
dart
final provider = StreamProvider<int>((ref) {
final controller = StreamController<int>();
ref.onDispose(controller.close);
return controller.stream;
});You can call onDispose multiple times (e.g. one per disposable resource). Return value of onDispose/onCancel can be called to unregister. For more detail and select/listenManual, see reference.md.
在provider内部你可以注册回调:
- ref.onDispose(callback) — 当provider状态被销毁时调用(例如自动销毁或重新计算)。用于关闭StreamControllers、取消计时器等。不要在onDispose中触发修改其他providers的副作用。
- ref.onCancel(callback) — 当最后一个监听器被移除时调用(在销毁之前)。ref.onResume(callback) — 当onCancel之后再次添加监听器时调用。
dart
final provider = StreamProvider<int>((ref) {
final controller = StreamController<int>();
ref.onDispose(controller.close);
return controller.stream;
});你可以多次调用onDispose(例如每个可销毁资源调用一次)。onDispose/onCancel的返回值可用于取消注册。如需了解更多细节以及select/listenManual的用法,请查看reference.md。