Flutter使用graphql包如何移除__typename及多余字段,对齐Postman
Flutter graphql 插件返回多余__typename字段的解决方法
问题根源
graphql Flutter插件默认会从两个层面自动为请求注入__typename字段:
- 内置缓存模块为了做对象识别,会自动在每个查询选择集中追加
__typename - 代码生成流程默认会在生成GraphQL文档时补上
__typename
这类注入完全在客户端侧完成,哪怕你自己编写的查询里没有该字段,最终发往服务端的请求也会带上它,服务端自然会返回对应内容。而Postman不存在这类自动注入逻辑,因此返回的是和手写查询完全匹配的纯净结果。
配置调整步骤
- 关闭缓存模块的自动注入
初始化Cache实例时,将addTypename参数设为false,从根源阻断缓存层的自动字段注入,示例代码:final cache = Cache( addTypename: false, ); - 配置请求策略保证返回纯净
初始化GraphQLClient时,指定默认请求策略,避免缓存读取过程补全非业务字段,示例代码:final client = GraphQLClient( link: httpLink, // 替换为你实际的链路配置(HttpLink/鉴权Link等) cache: cache, defaultPolicies: const Policies( query: PolicyCache( fetch: FetchPolicy.networkOnly, ), ), ); - 关闭代码生成阶段的自动注入
如果项目使用graphql_codegen配合build_runner生成GraphQL类型、文档,需要修改build.yaml配置,关闭生成流程的自动追加逻辑:targets: $default: builders: graphql_codegen|graphql_builder: options: add_typename: false
效果验证
在接口链路中添加日志模块,将最终发往服务端的完整GraphQL查询、请求变量打印出来,和Postman中手写的请求内容做对比,只要两者完全一致,得到的响应就会和Postman返回完全相同,不存在__typename或其他非业务多余字段。
内容的提问来源于stack exchange,提问作者Faiz Ahammed
相关产品推荐
相关产品推荐

