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

使用graphql_flutter执行GraphQL查询时遭遇两次语法错误求助

解决Flutter中graphql_flutter的GraphQL查询语法错误

初始错误分析与修正

你第一次遇到的错误Expected a selection set starting with '{',核心问题有两个:

  1. 变量类型不合法:GraphQL要求输入类型名称必须是PascalCase格式(比如ContactFilterInput),且必须与后端Schema定义的类型完全匹配,你写的filters既不符合命名规范,也大概率不是后端实际定义的类型。
  2. 过滤条件结构不符合预期:你直接把手机号字符串放进or数组,但后端的过滤输入类型通常需要键值对形式(指定匹配的字段),比如针对userPhoneNumber字段做匹配。

修改后的错误分析与修正

你给查询加了外层大括号,这违反了GraphQL语法规则——命名查询(带query关键字)不能被外层大括号包裹,这才导致了Expected an argument name的错误。

完整修正代码

1. 修正GraphQL查询语句

把变量类型替换成后端实际的输入类型(比如ContactFilterInput,请根据后端Schema调整):

const String getAzureContacts = """
  query filterItems(\$filter: ContactFilterInput!) {
    items(filter: \$filter) {
      items {
        partitionKey
        userPhoneNumber
        userDisplayName
      }
    }
  }
""";

2. 修正过滤条件构造

调整filter的结构,确保符合后端输入要求:

final phoneNumbers = ["4160000000", "7780000000"];
// 构造每个手机号对应的字段匹配条件
final filters = phoneNumbers.map((phone) => {"userPhoneNumber": phone}).toList();

Map<String, dynamic> filter = {
  "or": filters,
};

3. 完整调用代码

final phoneNumbers = ["4160000000", "7780000000"];

final filters = phoneNumbers.map((phone) => {"userPhoneNumber": phone}).toList();

Map<String, dynamic> filter = {
  "or": filters,
};

const String getAzureContacts = """
  query filterItems(\$filter: ContactFilterInput!) {
    items(filter: \$filter) {
      items {
        partitionKey
        userPhoneNumber
        userDisplayName
      }
    }
  }
""";

HttpLink link = GlobalVariables().graphqlEndpoint;
GraphQLClient graphQlClient = GraphQLClient(
  link: link,
  cache: GraphQLCache(
    store: InMemoryStore(),
  ),
);
try {
  QueryResult queryResult = await graphQlClient.query(
    QueryOptions(
        fetchPolicy: FetchPolicy.networkOnly,
        document: gql(getAzureContacts),
        variables: {'filter': filter}),
  );
  print(queryResult.data);
} catch (e) {
  print('Query failed: $e');
}

关键注意事项

  • 必须确认后端Schema中定义的过滤输入类型名称,替换代码中的ContactFilterInput,可以通过后端的GraphQL Playground或Schema文档查看。
  • 如果后端支持批量匹配的操作符(比如userPhoneNumber_in),可以简化过滤条件为{"userPhoneNumber_in": phoneNumbers},无需构造or数组,具体以后端Schema为准。

内容的提问来源于stack exchange,提问作者Sumchans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:34:57