Flutter Ferry传递null至GraphQL筛选变量时报错求助
Flutter Ferry 传递null筛选变量失效问题解决方案
1. 强制序列化保留null字段
Ferry默认依赖json_serializable生成序列化代码,默认会忽略null值。你需要在对应的筛选模型类中,给eq字段添加@JsonKey(includeIfNull: true)注解:
class DeletedByProfileGuidFilter { final String? eq; DeletedByProfileGuidFilter({this.eq}); @JsonKey(includeIfNull: true) Map<String, dynamic> toJson() => _$DeletedByProfileGuidFilterToJson(this); }
如果是ferry_generator自动生成的代码,你可以修改.gql.dart生成模板,或者在GraphQL Schema的筛选类型上添加自定义指令,让生成器自动带上该注解。
2. 手动构造变量Map绕过自动序列化
如果修改生成代码不方便,直接用Map构造变量,强制保留null值:
final queryVars = { 'deletedByProfileGuid': { 'eq': null, }, }; // 将此Map直接传入Ferry的查询请求
这种方式可以跳过自动序列化的null值过滤,确保请求JSON中保留"eq": null的合法格式。
3. 检查Ferry客户端序列化配置
初始化GraphQLClient时,确认使用的序列化器未配置移除null字段的规则:
final client = GraphQLClient( link: HttpLink('你的API地址'), cache: Cache(), serializers: DefaultSerializers(), );
避免自定义序列化逻辑中误删null字段。
额外排查点
- 抓包对比客户端发送的请求与GraphQL Playground的请求,确认JSON结构差异,定位null值丢失的具体环节。
- 验证HotChocolate服务的筛选器配置,确保其支持接收null作为筛选值(虽然Playground可正常执行,但需确认客户端请求格式与Playground完全一致)。
内容的提问来源于stack exchange,提问作者THE AMAZING
相关产品推荐
相关产品推荐

