mcpField
R
riverpod-auto-dispose

riverpod-auto-dispose

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

关于 riverpod-auto-dispose

面向 Dart 开发者的 Riverpod 技能,说明自动销毁机制和 Provider 生命周期管理。内容涵盖启用配置、清理回调、失效处理、保持状态存活及实现定时缓存。

主要功能

  1. 01启用或关闭自动销毁
  2. 02处理取消与销毁回调
  3. 03使 Provider 状态失效
  4. 04保持选定状态存活
  5. 05使用计时器实现定时缓存

适用场景

  1. 01Provider 不再有监听者时释放资源
  2. 02避免长期保留各个 family 参数对应的状态
  3. 03保留成功结果,同时销毁未使用或失败的状态

安装

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

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

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

详细介绍

Riverpod — 自动销毁

说明

启用自动销毁后,如果某个 provider 连续一帧没有监听者,Riverpod 就会销毁其状态。这样可以释放内存,并在不再使用该 provider 时停止相关工作(例如网络请求)。

启用
  • **代码生成:**默认启用。使用 @Riverpod(keepAlive: true) 可将其禁用。
  • **手动:**创建 provider 时添加 isAutoDispose: true(例如 Provider.autoDispose(...) 或 FutureProvider.autoDispose(...))。
// Codegen: disable auto-dispose
@Riverpod(keepAlive: true)
String helloWorld(Ref ref) => 'Hello world!';

// Manual: enable
final helloWorldProvider = Provider<String>(
  isAutoDispose: true,
  (ref) => 'Hello world!',
);

当 provider 带有参数(family)时,请启用自动销毁,以免永久缓存每种参数组合并导致内存泄漏。

何时执行销毁

Riverpod 会统计监听者数量(来自 ref.watch、ref.listen 等)。当数量降为零时,它会等待一帧;如果数量仍为零,就会执行 ref.onCancel,然后销毁状态并执行 ref.onDispose。

对销毁作出响应:ref.onDispose

注册一个在状态销毁时执行的回调(例如,关闭 StreamController):

final provider = StreamProvider<int>((ref) {
  final controller = StreamController<int>();
  ref.onDispose(controller.close);
  return controller.stream;
});

不要在 onDispose 中触发会修改其他 provider 的副作用。你可以多次调用 onDispose。其他生命周期包括:ref.onCancel(最后一个监听者被移除时)和 ref.onResume(取消监听后有新的监听者添加时)。

强制销毁:ref.invalidate

在 widget 或其他 provider 中,调用 ref.invalidate(provider) 可销毁当前状态。如果该 provider 仍被监听,它会重新计算;否则会保持销毁状态,直到再次读取。

onPressed: () => ref.invalidate(someProvider),

对于 family provider,你可以使单个参数组合或所有参数组合失效(参见 riverpod-family 和文档)。

保持状态:ref.keepAlive

启用自动销毁后,你可以调用 ref.keepAlive(),使状态在下次重新计算前不会被销毁。可用此方法在允许失败或未使用的状态被销毁的同时,保留成功的结果。返回值可用于恢复自动销毁。如果 provider 重新计算,自动销毁会重新启用。

按时长缓存

Riverpod 不提供内置的“缓存 X 秒”功能。你可以通过 Timer 和 ref.keepAlive 实现,也可以使用 ref.onCancel/onResume,在一段时间没有监听者后销毁状态。

评论

支持 Markdown