You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Riverpod的AsyncNotifier中部分更新AsyncValue实现Todo删除?

Riverpod v2 AsyncNotifier 实现本地状态部分更新(无需重新拉取全量数据)

要实现AsyncNotifier的removeTodo方法不依赖重新拉取全量数据,直接修改本地状态完成更新,核心是利用AsyncValue的不可变特性,基于当前已加载的有效数据生成新状态,同时正确处理异步请求的状态流转。具体实现如下:

修改后的代码示例

// 异步版本的removeTodo方法(本地状态直接更新)
Future<void> removeTodo(String todoId) async {
  // 获取当前已加载的待办列表,若当前状态非data则直接返回
  final currentTodos = state.value;
  if (currentTodos == null) return;

  // 设置加载状态,同时保留之前的数据快照(避免UI空白,提升体验)
  state = AsyncValue.loading().copyWithPrevious(state);

  try {
    // 调用删除接口
    await http.delete(Uri.parse('api/todos/$todoId'));
    
    // 基于当前数据过滤掉目标待办,生成新列表
    final newTodos = currentTodos.where((todo) => todo.id != todoId).toList();
    
    // 更新状态为包含新列表的data状态
    state = AsyncValue.data(newTodos);
  } catch (e, stackTrace) {
    // 请求失败时,恢复原有状态并携带错误信息
    state = AsyncValue.error(e, stackTrace).copyWithPrevious(state);
    // 若不需要保留错误状态,也可直接恢复原数据:state = AsyncValue.data(currentTodos);
  }
}

关键说明

  • 状态不可变处理:必须基于currentTodos生成新列表,不能直接修改原列表,符合Riverpod的状态不可变设计原则
  • 加载态优化:使用copyWithPrevious在加载过程中保留旧数据,避免UI出现空白,提升用户体验
  • 异常兜底:确保请求失败时状态不会停留在加载态,要么恢复原数据,要么展示错误状态

内容的提问来源于stack exchange,提问作者Vinci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 17:45:17