关于 riverpod-auto-dispose
面向 Dart 开发者的 Riverpod 技能,说明自动销毁机制和 Provider 生命周期管理。内容涵盖启用配置、清理回调、失效处理、保持状态存活及实现定时缓存。
主要功能
- 01启用或关闭自动销毁
- 02处理取消与销毁回调
- 03使 Provider 状态失效
- 04保持选定状态存活
- 05使用计时器实现定时缓存
适用场景
- 01Provider 不再有监听者时释放资源
- 02避免长期保留各个 family 参数对应的状态
- 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,在一段时间没有监听者后销毁状态。