Flutter AWS Amplify GraphQL:User模型无法访问关联的SubscriptionType模型
问题描述
使用Amplify GraphQL结合DynamoDB创建数据模型,包含User和SubscriptionType,二者为一对多关联:
- 每个
User仅对应一个SubscriptionType - 一个
SubscriptionType可关联多个User
执行amplify pull拉取模型后,发现User模型类无法访问SubscriptionType模型,但SubscriptionType模型能正常访问User模型。
相关代码
ModelProvider.dart
import 'package:amplify_core/amplify_core.dart' as amplify_core; import 'SubscriptionType.dart'; import 'User.dart'; export 'SubscriptionType.dart'; export 'User.dart'; class ModelProvider implements amplify_core.ModelProviderInterface { @override String version = "4826e6c1ddaab534f826f93cee0d7763"; @override List<amplify_core.ModelSchema> modelSchemas = [SubscriptionType.schema, User.schema]; @override List<amplify_core.ModelSchema> customTypeSchemas = []; static final ModelProvider _instance = ModelProvider(); static ModelProvider get instance => _instance; amplify_core.ModelType getModelTypeByModelName(String modelName) { switch(modelName) { case "SubscriptionType": return SubscriptionType.classType; case "User": return User.classType; default: throw Exception("Failed to find model in model provider for model name: " + modelName); } } } class ModelFieldValue<T> { const ModelFieldValue.value(this.value); final T value; }
相关截图
- 报错截图:

- Amplify数据建模截图:

解决方法
1. 校验GraphQL Schema关联定义
从建模截图确认User模型是否正确配置了指向SubscriptionType的@belongsTo关联。正确的Schema示例如下:
type User @model { id: ID! # 其他业务字段 subscriptionTypeID: ID! subscriptionType: SubscriptionType @belongsTo(fields: ["subscriptionTypeID"]) } type SubscriptionType @model { id: ID! # 其他业务字段 users: [User] @hasMany(indexName: "bySubscriptionType", fields: ["id"]) }
若User模型缺少@belongsTo关联配置,Amplify生成本地模型时不会生成对应的关联属性,导致无法访问SubscriptionType。
2. 重新推送并拉取模型
- 修改Schema后,执行
amplify push更新云端模型配置 - 执行
amplify pull重新拉取本地模型文件 - 检查自动生成的
User.dart,确认是否包含subscriptionType关联属性及对应的读写方法
3. 检查本地生成的User模型
打开自动生成的User.dart,确认是否存在类似以下的代码片段:
SubscriptionType? get subscriptionType { return _subscriptionType; } set subscriptionType(SubscriptionType? value) { _subscriptionType = value; _subscriptionTypeID = value?.id; }
若缺失该代码,说明模型生成不完整,需重新执行推送和拉取操作。
4. 清理项目缓存并重建
- 执行
flutter clean清理Flutter项目缓存 - 执行
flutter pub get重新获取依赖 - 执行
flutter run重新构建项目
内容的提问来源于stack exchange,提问作者draxex
相关产品推荐
相关产品推荐

