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

Flutter中GraphQL的ModelMutations.update()无法正常更新数据

Amplify Flutter update操作返回成功但数据未更新的解决方案

问题核心原因

你遇到的是乐观锁版本不匹配导致的静默无更新:请求返回成功且DynamoDB的version字段递增,但实际数据未变更——Amplify默认启用乐观锁,当传入的更新对象未携带正确的当前version值时,DynamoDB会跳过更新操作,但返回成功响应(仅版本号自增)。

Flutter/Dart中的主键与版本校验机制

Amplify Flutter不需要像Lambda那样显式调用.key(),但有两个硬性要求:

  • 更新对象必须包含完整的主键信息(比如id字段,与待更新项一致)
  • 必须携带待更新项的当前version值(用于乐观锁校验)

正确实现步骤

  1. 查询获取原始数据:拿到包含主键和当前version的完整对象
  2. 基于原始对象修改字段:通过copyWith方法修改目标字段,保留原始主键和version
  3. 执行更新操作:将修改后的对象传入ModelMutations.update()

示例代码:

// 1. 查询待更新的原始数据
final queryResponse = await Amplify.API.query(
  request: ModelQueries.get(YourModel.classType, "目标数据ID"),
).response;

if (queryResponse.data == null) {
  print("未找到目标数据");
  return;
}

// 2. 修改字段(保留原始id和version)
final updatedItem = queryResponse.data!.copyWith(
  // 替换为你要更新的字段和值
  isEnabled: !queryResponse.data!.isEnabled,
);

// 3. 执行更新
final mutateResponse = await Amplify.API.mutate(
  request: ModelMutations.update(updatedItem),
).response;

if (mutateResponse.hasErrors) {
  print("更新失败: ${mutateResponse.errors}");
} else {
  print("更新成功");
}

为什么之前的操作无效

如果直接创建新的YourModel对象,仅设置主键和要修改的字段却未携带正确的version值,乐观锁会判定版本不匹配,DynamoDB只会递增version但不更新数据,而Amplify会返回"成功"响应(因为请求本身无语法错误)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:40:24