Flutter调用Laravel GraphQL接口传参报错及无返回值问题求助
问题排查与解决步骤
语法错误修复说明
你最开始遇到的SourceSpanException是因为GraphQL语法要求:变量必须先在查询的根签名中声明,才能在字段参数中使用,你修改后的查询语法已经符合规范,无需再调整语法结构。
无返回结果的排查方案
按优先级依次排查以下点:
1. 修复参数类型不匹配问题
你Laravel Schema中定义的user查询id参数为ID类型,但你Flutter查询中声明的变量是Int!类型,类型不匹配会导致后端参数校验失败、匹配不到数据,修改如下:
document: gql(r''' query GetUser($id: ID!) { user(id: $id) { id name email } } '''), variables:{ 'id': "9", // ID类型兼容字符串和数字,统一传字符串避免Laravel侧类型校验不通过 },
2. 打印完整请求响应排查错误
给你的graphql_flutter客户端加日志中间件,输出完整的请求参数、响应内容,确认是否有隐藏的报错:
// 初始化GraphQLClient时添加LoggingLink final client = GraphQLClient( link: HttpLink( '你的GraphQL接口地址', defaultHeaders: {'Accept': 'application/json'}, ).concat(LoggingLink()), // 开启日志后控制台会打印所有请求和返回数据 cache: GraphQLCache(), );
重点看返回结果中的errors字段,权限不足、参数格式错误、路由错误等问题都会在这里有明确提示。
3. 校验请求上下文差异
对比graphql-playground的请求和Flutter请求的差异:
- 确认是否缺少权限头:如果接口需要登录鉴权,检查Flutter请求是否携带了和playground一致的
Authorization头 - 确认接口地址是否正确:避免测试环境和生产环境地址混用
- 确认
@eq指令行为:Laravel Lighthouse的@eq指令默认是严格匹配,若变量类型和数据库字段类型不一致会匹配不到数据。
4. 简化测试验证
可以先写死参数在Flutter的查询语句里,确认能正常返回后再改回变量传参,排除变量传递逻辑的问题:
// 测试用硬编码查询,确认接口连通性 document: gql(r''' query { user(id: 9) { id name email } } '''),
内容的提问来源于stack exchange,提问作者DolDurma
相关产品推荐
相关产品推荐

