用途:说明 Riverpod 中 Ref(及 widget 中的 WidgetRef)如何与 provider 交互,包括读取状态、监听变化、重置状态和注册生命周期回调。
获取 Ref:在 provider 内,Ref 是 provider 函数的第一个参数,或在 Notifier 中通过 this.ref 获取。在 widget 内,通过 Consumer(builder 提供 ref)、ConsumerWidget(build(context, ref))或 ConsumerStatefulWidget(state 含 ref)获取,必要时可把 ref 传给其他函数。
监听状态:ref.watch(provider) 为声明式,provider 变化时 widget/provider 重建,默认用于 build 方法;ref.listen(provider, (prev, next) {...}) 为命令式,在 provider 变化时执行副作用(如弹窗、导航),可在 build 中使用,initState 中应改用 ref.listenManual 并自行管理订阅。
不监听读取:ref.read(provider) 获取当前值但不订阅,适合事件处理器(如 onPressed),不应以此替代 watch 来“优化”;如需选择性重建可用 ref.watch(provider.select((value) => ...))。
重置状态:ref.invalidate(provider) 丢弃当前状态,下次读取时重新计算;若 provider 被监听则创建新状态。ref.refresh(provider) 等于 invalidate + read,失效并立即返回新值。
生命周期:provider 内可注册 ref.onDispose(callback),在状态销毁(如 auto-dispose 或重算)时调用,用于关闭 StreamController、取消定时器等;不要在 onDispose 中触发修改其他 provider 的副作用。ref.onCancel(callback) 在最后一个监听者被移除时(销毁前)调用,ref.onResume(callback) 在 onCancel 后再次添加监听者时调用。onDispose 可多次调用,返回值可用于取消注册。更多细节见参考文档。限制:资料未提供平台、收费、价格等信息。