Flutter中Freezed的@JsonKey(ignore:true)未生效引发非空参数异常
问题原因
@JsonKey(ignore: true) 只负责控制字段是否参与JSON的序列化/反序列化,不会让Freezed忽略这个字段本身。Freezed依然会把它当成类的常规参数做校验——你的List<ObjectB>是非空类型,但既没加required强制传参,也没通过@Default设置默认值,所以触发了非空校验错误。
解决方案
根据你的实际需求选对应的处理方式:
1. 保留字段但不参与JSON序列化
如果这个字段需要作为类的成员存在,只是不需要转JSON,给它加默认值或者设为必填:
@freezed class ObjectA with _$ObjectA { const factory ObjectA({ @JsonKey(ignore: true) // 给空列表作为默认值 @Default([]) List<ObjectB> objectBList, }) = _ObjectA; factory ObjectA.fromJson(Map<String, dynamic> json) => _$ObjectAFromJson(json); }
或者如果要求调用时必须传这个值,加required:
@freezed class ObjectA with _$ObjectA { const factory ObjectA({ @JsonKey(ignore: true) required List<ObjectB> objectBList, }) = _ObjectA; factory ObjectA.fromJson(Map<String, dynamic> json) => _$ObjectAFromJson(json); }
2. 完全让Freezed忽略这个字段
如果这个字段根本不需要作为类的成员,只是临时使用,用Freezed自带的@Ignore注解代替@JsonKey(ignore: true):
@freezed class ObjectA with _$ObjectA { const factory ObjectA({ @Ignore List<ObjectB> objectBList, }) = _ObjectA; factory ObjectA.fromJson(Map<String, dynamic> json) => _$ObjectAFromJson(json); }
注意:Dart变量名规范是小驼峰,建议把
ObjectBList改成objectBList。
内容的提问来源于stack exchange,提问作者genericUser
相关产品推荐
相关产品推荐

