Amplify Flutter 创建多对多关联条目时返回空值,无法写入DynamoDB
解决Amplify GraphQL多对多关联创建失败问题
1. 检查自动生成的UserRoom模型结构
使用@manyToMany注解后,Amplify会自动生成UserRoom连接模型。该模型需要通过外键ID(roomId、userId)关联User和Room,而非直接传入完整的User/Room对象。你可以在项目的lib/models/目录下查看生成的UserRoom.dart,确认是否包含roomId和userId这两个必填字段。
2. 修改创建关联的代码逻辑
将传入完整对象改为传入ID值,同时增加响应错误校验,以便定位问题:
Future<UserRoom?> join(Room room, User user) async { try { // 使用外键ID创建关联,而非完整对象 final userRoom = UserRoom(roomId: room.id, userId: user.id); final request = ModelMutations.create(userRoom); final response = await Amplify.API.mutate(request: request).response; // 捕获GraphQL返回的非异常类错误信息 if (response.hasErrors) { safePrint("GraphQL 创建失败错误: ${response.errors.map((e) => e.message).join(', ')}"); return null; } return response.data; } catch (error) { safePrint("创建UserRoom时抛出异常: $error"); } return null; }
3. 确认UserRoom模型的权限配置
自动生成的UserRoom模型可能未继承User/Room的权限规则,需要检查你的GraphQL schema中UserRoom的@auth配置,确保允许public执行create操作:
type UserRoom @model @auth(rules: [{ allow: public, operations: [create, read], provider: iam }]) { id: ID! room: Room! @belongsTo user: User! @belongsTo }
如果权限缺失,需要更新schema后重新执行amplify codegen models生成新的模型文件。
4. 调试建议
- 打开Amplify调试日志:在初始化Amplify时添加
Amplify.debugLogEnabled = true;,查看API请求的详细过程 - 确认传入的
room.id和user.id对应的记录已存在于DynamoDB的User、Room表中
内容的提问来源于stack exchange,提问作者J. Lee
相关产品推荐
相关产品推荐

