mcpField
R
riverpod-refs

riverpod-refs

github.com/serverpod开发1080 次安装34 周前更新
代码仓库

关于 riverpod-refs

面向使用 Riverpod 的 Dart 开发者,说明如何在组件和 Provider 函数中操作 Ref。内容涵盖状态读取、监听、失效处理和生命周期回调,并附有用法指导与代码示例。

主要功能

  1. 01获取 Ref 和 WidgetRef
  2. 02监听、读取和订阅 Provider
  3. 03选择值以进行定向重建
  4. 04使 Provider 状态失效或刷新
  5. 05注册销毁和监听器回调

适用场景

  1. 01在组件中选择合适的 Provider 访问方式
  2. 02在 Provider 状态变化时执行副作用
  3. 03重置 Provider 并获取新值
  4. 04通过生命周期回调清理流或计时器

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/serverpod/skills-registry --skill riverpod-refs

安装后在 Claude Code 中输入/riverpod-refs确认已加载。

附带文件reference.md

详细介绍

Riverpod — Refs

说明

Ref(以及组件中的 WidgetRef)用于与提供程序交互:读取状态、监听更改、重置状态,以及注册生命周期回调。提供程序会将 Ref 作为其函数的第一个参数,或在 Notifier 中通过 this.ref 获取。组件可通过 Consumer / ConsumerWidget / ConsumerState 获取 WidgetRef。

获取 Ref
  • 在提供程序中: 提供程序函数的第一个参数,或 Notifier 中的 ref 属性。
  • 在组件中: 使用 Consumer(builder 会提供 ref)、ConsumerWidget(build(context, ref)),或 ConsumerStatefulWidget(state 中有 ref)。如有需要,可将 ref 传递给其他函数。
监听状态
  • ref.watch(provider) — 声明式。当提供程序发生变化时,组件/提供程序会重新构建。默认在 build 方法中使用。
  • ref.listen(provider, (prev, next) { ... }) — 命令式。当提供程序发生变化时执行副作用(例如显示对话框、导航)。可安全地在 build 中使用;在 initState 中使用时,请改用 ref.listenManual 并管理订阅。
// 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.read(provider) — 获取当前值,但不订阅。用于事件处理程序(例如 onPressed),不要为了“优化”而避免使用 watch。若要选择性地触发重建,请使用 ref.watch(provider.select((value) => ...))。
onPressed: () {
  final tick = ref.read(tickProvider);
  print('Current tick: $tick');
}
重置状态
  • ref.invalidate(provider) — 丢弃当前状态;提供程序会在下次读取时重新计算。如果提供程序正在被监听,则会创建新状态。
  • ref.refresh(provider) — 效果等同于 invalidate + read:使状态失效并返回新值。需要立即获取新值时使用。
ref.invalidate(tickProvider);
// or
final newTick = ref.refresh(tickProvider);
生命周期:onDispose、onCancel

在提供程序内部可以注册回调:

  • ref.onDispose(callback) — 提供程序状态销毁时调用(例如自动释放或重新计算时)。可用于关闭 StreamControllers、取消计时器等。请勿在 onDispose 中触发会修改其他提供程序状态的副作用。
  • ref.onCancel(callback) — 最后一个监听器移除时调用(在释放之前)。ref.onResume(callback) — 在 onCancel 之后再次添加监听器时调用。
final provider = StreamProvider<int>((ref) {
  final controller = StreamController<int>();
  ref.onDispose(controller.close);
  return controller.stream;
});

可以多次调用 onDispose(例如,为每个可释放资源分别调用一次)。调用 onDispose/onCancel 的返回值即可取消注册。更多关于 select/listenManual 的详情,请参阅 reference.md。

评论

支持 Markdown