关于 riverpod-mutations
riverpod-mutations 是介绍 Riverpod 实验性 Mutations API 的技能,面向需要将单次异步操作状态与主要 Provider 状态分离的开发者。内容涵盖状态监听、触发、按键区分实例和重置。
主要功能
- 01表示单次异步操作
- 02监听空闲、进行中、成功和错误状态
- 03通过回调触发操作并返回结果
- 04按键管理多个 Mutation 实例
- 05支持手动重置状态
适用场景
- 01在界面中呈现操作进度与结果
- 02避免将加载和错误状态放入主要 Provider 状态
- 03为列表中的每个项目分别跟踪操作
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ serverpod/ skills-registry --skill riverpod-mutations安装后在 Claude Code 中输入/riverpod-mutations确认已加载。
详细介绍
Riverpod — Mutations(实验性)
说明
Mutations 表示 UI 可以响应的单个异步操作(例如“添加待办事项”进行中、成功或失败)。它们将加载、错误和成功状态从主 provider 状态中分离出来。此 API 仍处于实验阶段,可能会发生变化。
定义 mutation
创建一个 Mutation<T> 实例(T 是结果类型,可选):
final addTodo = Mutation<Todo>();
通常将其作为全局变量,或作为 Notifier 上的 static final 成员存储。
监听
在 Consumer 中(或 provider 内部)使用 ref.watch 驱动 UI:
final addTodoState = ref.watch(addTodo);
// In build:
backgroundColor: switch (addTodoState) {
MutationError() => const WidgetStatePropertyAll(Colors.red),
_ => null,
},
if (addTodoState is MutationPending) ...[
const SizedBox(width: 8),
const CircularProgressIndicator(),
],
状态
- MutationIdle — 尚未启动或已重置。
- MutationPending — 进行中。
- MutationSuccess — 已成功;结果可用。
- MutationError — 已失败;错误可用。
使用 switch 根据状态处理每种情况。
触发
调用 Mutation.run(ref, callback)。回调会接收一个事务对象(例如 tsx),用于访问 providers,并且必须返回 T 类型的值:
addTodo.run(ref, (tsx) async {
final todoNotifier = tsx.get(todoNotifierProvider.notifier);
final createdTodo = await todoNotifier.addTodo('Eat a cookie');
return createdTodo;
});
使用 tsx.get(provider),让 providers 在 mutation 执行期间保持存活。
按键区分的 mutations
传入一个 key,即可创建多个实例(例如,每个列表项一个 mutation):
ref.watch(deleteItemMutation(itemId));
deleteItemMutation(itemId).run(ref, (tsx) async { ... });
重置
mutations 会在完成时或所有监听器移除时重置为 Idle。手动重置:
addTodo.reset(ref);
有关最新的 mutation API 和泛型,请参阅 Riverpod 官方文档。
评论
支持 Markdown