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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:15:21