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

graphql_flutter调用mutation自动加__typename触发gqlgen校验错误如何解决

问题原因

graphql_flutter 包默认开启了自动添加__typename字段的能力,用于内部缓存的数据归一化。该逻辑会对所有Object类型的请求变量自动插入__typename,而你的UserNotificationsInput属于GraphQL Input类型,服务端gqlgen默认会校验Input字段的合法性,未定义的__typename字段就会触发校验失败。

解决方案

按优先级从高到低选择即可:

方案1:全局关闭自动添加__typename(适合你当前无缓存的场景)

你当前配置的全局请求策略为FetchPolicy.noCache,不需要依赖__typename做缓存,直接关闭缓存的自动添加__typename配置即可:

GraphQLClient clientForAPIRequests = GraphQLClient(
  link: link,
  // 新增addTypename: false关闭自动插入
  cache: GraphQLCache(addTypename: false),
  defaultPolicies: DefaultPolicies(
    query: policies,
    mutate: policies,
  )
);

方案2:仅对Input类型关闭__typename添加(保留缓存能力的最优解)

如果后续需要使用缓存功能,不要全局关闭,只需要给触发问题的Input类型配置不添加__typename的规则:

final cache = GraphQLCache(
  typePolicies: {
    // 对UserNotificationsInput类型关闭自动加__typename
    'UserNotificationsInput': TypePolicy(addTypename: false),
    // 其他触发同类问题的Input类型也可以在此补充
  },
);

GraphQLClient clientForAPIRequests = GraphQLClient(
  link: link,
  cache: cache,
  defaultPolicies: DefaultPolicies(
    query: policies,
    mutate: policies,
  )
);

方案3:单个请求单独关闭__typename

如果只有个别请求触发该问题,不需要改全局配置,直接给对应Mutation的请求参数加配置即可:

final result = await clientForAPIRequests.mutate(
  MutationOptions(
    document: gql(createUser),
    variables: yourRequestVariables,
    policies: Policies(
      fetch: FetchPolicy.noCache,
      // 单独给该请求关闭缓存相关的__typename插入
      cache: CachePolicy(store: CacheStore.none),
    ),
  ),
);

方案4:服务端兼容(不推荐)

如果不方便修改客户端代码,可以在gqlgen侧做兼容:

  • 在UserNotificationsInput定义中新增可选的__typename: String字段
  • 或者编写全局中间件,在变量校验前自动删除所有Input中携带的__typename字段

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:45:00