mcpField
R
riverpod-cancel

riverpod-cancel

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

关于 riverpod-cancel

面向需要管理 Provider 请求生命周期的 Riverpod 开发者。它介绍如何在 Provider 释放时取消进行中的请求,以及延迟请求以防抖连续刷新。

主要功能

  1. 01Provider 释放时取消请求
  2. 02对快速刷新进行防抖
  3. 03释放时关闭 HTTP 客户端
  4. 04可复用的 Ref 扩展模式

适用场景

  1. 01离开页面时停止请求
  2. 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)。模式如下:

  1. 在提供程序中设置一个标志(例如 didDispose = false),并使用 ref.onDispose(() => didDispose = true)。
  2. await Future.delayed(duration)。
  3. 如果 didDispose 为 true,说明用户在延迟期间又触发了刷新;此时 throw 以中止操作(Riverpod 会捕获并忽略异常)。否则,创建客户端,注册 onDispose(client.close),然后执行请求。

也就是说:先延迟,再创建客户端并执行请求;如果在延迟期间被释放,就中止操作;如果在创建客户端后被释放,就取消请求。

可复用的扩展

你可以在 Ref 上实现一个扩展,用于返回经过防抖且可取消的客户端:

  • 使用 onDispose 设置“已取消”标志。
  • 等待防抖时长;如果已释放,则抛出异常。
  • 创建客户端,调用 onDispose(client.close),然后返回客户端。

在你的活动或提供程序中使用此扩展,让所有调用位置都具备防抖和取消行为。完整的扩展示例请参阅 Riverpod 官方的“cancel”操作指南。

评论

支持 Markdown