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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:01:17