关于 riverpod-cancel
面向需要管理 Provider 请求生命周期的 Riverpod 开发者。它介绍如何在 Provider 释放时取消进行中的请求,以及延迟请求以防抖连续刷新。
主要功能
- 01Provider 释放时取消请求
- 02对快速刷新进行防抖
- 03释放时关闭 HTTP 客户端
- 04可复用的 Ref 扩展模式
适用场景
- 01离开页面时停止请求
- 02避免快速连续刷新触发重复请求
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ serverpod/ skills-registry --skill riverpod-cancel安装后在 Claude Code 中输入/riverpod-cancel确认已加载。
详细介绍
Riverpod — 取消请求并防抖
说明
使用 ref.onDispose 搭配 auto-dispose(或 ref.watch),在用户离开页面时取消正在进行的请求,或对快速刷新的请求进行防抖。
离开页面时取消请求
确保提供程序启用了 auto-dispose。用户导航离开后,提供程序会失去其监听器并被释放;此时会运行 ref.onDispose。在该回调中取消请求(例如,关闭用于请求的 HTTP 客户端)。
示例模式:在提供程序中创建 http.Client(),将其传递给获取逻辑,并调用 ref.onDispose(client.close)。提供程序释放时,客户端会关闭并取消请求。具体 API 取决于你的 HTTP 软件包。
刷新请求防抖
如果用户在短时间内多次触发刷新,可以延迟实际请求,直到用户停止操作(例如,延迟 500ms)。模式如下:
- 在提供程序中设置一个标志(例如
didDispose = false),并使用 ref.onDispose(() => didDispose = true)。 - await Future.delayed(duration)。
- 如果 didDispose 为 true,说明用户在延迟期间又触发了刷新;此时 throw 以中止操作(Riverpod 会捕获并忽略异常)。否则,创建客户端,注册 onDispose(client.close),然后执行请求。
也就是说:先延迟,再创建客户端并执行请求;如果在延迟期间被释放,就中止操作;如果在创建客户端后被释放,就取消请求。
可复用的扩展
你可以在 Ref 上实现一个扩展,用于返回经过防抖且可取消的客户端:
- 使用 onDispose 设置“已取消”标志。
- 等待防抖时长;如果已释放,则抛出异常。
- 创建客户端,调用 onDispose(client.close),然后返回客户端。
在你的活动或提供程序中使用此扩展,让所有调用位置都具备防抖和取消行为。完整的扩展示例请参阅 Riverpod 官方的“cancel”操作指南。
评论
支持 Markdown