Flutter中GraphQL的ModelMutations.update()无法正常更新数据
Amplify Flutter update操作返回成功但数据未更新的解决方案
问题核心原因
你遇到的是乐观锁版本不匹配导致的静默无更新:请求返回成功且DynamoDB的version字段递增,但实际数据未变更——Amplify默认启用乐观锁,当传入的更新对象未携带正确的当前version值时,DynamoDB会跳过更新操作,但返回成功响应(仅版本号自增)。
Flutter/Dart中的主键与版本校验机制
Amplify Flutter不需要像Lambda那样显式调用.key(),但有两个硬性要求:
- 更新对象必须包含完整的主键信息(比如
id字段,与待更新项一致) - 必须携带待更新项的当前
version值(用于乐观锁校验)
正确实现步骤
- 查询获取原始数据:拿到包含主键和当前
version的完整对象 - 基于原始对象修改字段:通过
copyWith方法修改目标字段,保留原始主键和version - 执行更新操作:将修改后的对象传入
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
相关产品推荐
相关产品推荐

