Flutter Amplify GraphQL报错:Type 'Null' is not a subtype of 'String' 已解决
解决Flutter Amplify GraphQL查询列表时
type "Null" is not a subtype of "String"错误 问题现象
- 查询Activity列表时抛出
type "Null" is not a subtype of "String"错误 - 该查询在Amplify Studio和AppSync中执行正常,单个Activity查询也能正常工作
- 代码无法执行到return语句,断点停在
final test = await res.response处
报错代码
Future<Request<List<Activity?>>> fetchActivitiesByDay(TemporalDate day, String schoolID) async { try { const listActivities = 'listActivities'; const graphQLDocument = '''query MyQuery { listActivities { items { id end_time description title } } }'''; final getPostRequest = GraphQLRequest<Activity>( document: graphQLDocument, modelType: Activity.classType, // variables: <String, String>{'id': 'b34f6dfc-fb18-4f20-85cf-57e97671d480'}, decodePath: listActivities, ); final res = Amplify.API.query(request: getPostRequest); final test = await res.response; return formatRequestList<Activity?>(test); } on ApiException catch (e) { throw e.message; } }
尝试过的操作
- 使用匿名查询写法(省略查询名称),问题依旧:
query { listActivities { items { id end_time description title } } }
- 单个Activity查询可正常运行:
query GetActivity($id: ID!) { getActivity(id: $id) { id } }
Schema定义
type Activity @model @auth( rules: [{ allow: private, operations: [read, update] }, { allow: owner }] ) { id: ID! schoolID: ID! category: ActivityEnum! title: String! start_time: AWSTime! end_time: AWSTime! date: AWSDate! description: String! activityMessages: [ActivityMessage] @hasMany(indexName: "byActivity", fields: ["id"]) } type ActivityMessage @model @auth(rules: [{ allow: private, operations: [read] }, { allow: owner }]) { id: ID! schoolID: ID! activityID: ID! @index(name: "byActivity", sortKeyFields: ["message"]) activity: Activity! @belongsTo(fields: ["activityID"]) message: String isImage: Boolean! imageKey: String url: String likes: Int! createdAt: AWSDateTime updatedAt: AWSDateTime }
解决方法
错误原因是查询列表时误用了单个实例的模型类型:
原代码中modelType: Activity.classType仅适用于获取单个Activity对象,查询列表时需要用PaginatedModelType包装模型类型,告知Amplify要解析分页列表数据。
修改后的请求代码:
final getPostRequest = GraphQLRequest<Activity>( document: graphQLDocument, modelType: const PaginatedModelType(Activity.classType), // 替换此处 decodePath: listActivities, );
替换后即可正常获取Activity列表,错误消失。
内容的提问来源于stack exchange,提问作者Lukas Babaliauskas
相关产品推荐
相关产品推荐

