使用graphql_flutter执行GraphQL查询时遭遇两次语法错误求助
解决Flutter中graphql_flutter的GraphQL查询语法错误
初始错误分析与修正
你第一次遇到的错误Expected a selection set starting with '{',核心问题有两个:
- 变量类型不合法:GraphQL要求输入类型名称必须是PascalCase格式(比如
ContactFilterInput),且必须与后端Schema定义的类型完全匹配,你写的filters既不符合命名规范,也大概率不是后端实际定义的类型。 - 过滤条件结构不符合预期:你直接把手机号字符串放进
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
相关产品推荐
相关产品推荐

