关于 riverpod-retry
riverpod-retry 介绍 Riverpod 的 Provider 重试行为及自定义方式。开发者可按 Provider 或全局设置重试策略,并针对特定错误停止重试。
主要功能
- 01默认采用指数退避
- 02自定义重试函数
- 03按 Provider 设置策略
- 04全局设置重试策略
- 05返回 null 停止重试
适用场景
- 01在临时故障后重试 Provider
- 02为不同 Provider 设置独立策略
- 03通过 ProviderScope 应用统一策略
- 04对特定错误停止重试
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ serverpod/ skills-registry --skill riverpod-retry安装后在 Claude Code 中输入/riverpod-retry确认已加载。
详细介绍
Riverpod — 自动重试
说明
当 provider 的计算抛出异常时,Riverpod 会重试该 provider。可以针对单个 provider 或全局自定义重试行为。
默认行为
默认情况下,provider 最多会重试指定次数(例如 10 次),并采用指数退避策略(例如从 200ms 增至 6.4s)。Error 和 ProviderException 不会触发重试:Error 表示存在 bug;ProviderException 表示某个依赖项失败,因此不会重试依赖它的 provider(而是重试底层的 provider)。
自定义重试函数
重试函数的签名为 Duration? Function(int retryCount, Object error)。返回一个 Duration,表示下次重试前的延迟;返回 null 则停止重试。
Duration? myRetry(int retryCount, Object error) {
if (retryCount >= 5) return null;
if (error is ProviderException) return null;
return Duration(milliseconds: 200 * (1 << retryCount));
}
设置位置
- 单个 provider: 定义 provider 时传入
retry: myRetry(或使用代码生成时传入@Riverpod(retry: myRetry))。 - 全局: 向 ProviderScope 或 ProviderContainer 传入
retry: myRetry。
// Global
ProviderScope(retry: myRetry, child: MyApp())
// Per provider (manual)
final myProvider = Provider<int>(retry: myRetry, (ref) => 0);
禁用重试
始终返回 null:
ProviderScope(retry: (retryCount, error) => null, child: MyApp())
等待带重试的异步 provider
ref.watch(myProvider.future)(或等效写法)会持续等待,直到所有重试均已耗尽或 provider 成功。因此,await ref.watch(myProvider.future) 会跳过中间的失败,并在 provider 最终成功或放弃时完成。
评论
支持 Markdown