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

使用Freezed反序列化泛型类时遇类型不匹配编译错误

Freezed泛型反序列化类型不匹配问题解决

遇到的错误:The argument type 'NewUser Function(Map<String, dynamic>)' can't be assigned to the parameter type 'NewUser Function(Object?)'

问题原因

Freezed开启genericArgumentFactories: true后,生成的泛型类fromJson方法要求传入的泛型解析函数(fromJsonT)能接受Object?类型的参数——这是为了兼容泛型T可能是基础类型、列表等多种JSON场景。但默认生成的NewUser.fromJson只接受Map<String, dynamic>类型,导致类型不兼容。

两种解决方案

方案1:调用时用匿名函数做类型适配

不需要修改实体类,在调用ResponseWrapper.fromJson时,用匿名函数把Object?转为Map<String, dynamic>:

const String stringResponse = '{"Status": "Success", "Response": { "firstName": "XYZ", "middleName": "ABC", "surname": "EDF", "username": "abc", "emailId": "abc@gmail.com" } }';

final Map<String, dynamic> encoded = jsonDecode(stringResponse);
// 用匿名函数包装,做类型转换
final ResponseWrapper<NewUser> newUserWithWrapper = ResponseWrapper.fromJson(
  encoded,
  (json) => NewUser.fromJson(json as Map<String, dynamic>),
);

方案2:修改NewUser的fromJson签名

直接调整NewUser的fromJson方法,让它接受Object?参数,内部做类型转换:

@freezed
class NewUser with _$NewUser {
  const factory NewUser({
    String? firstName,
    String? middleName,
    String? surname,
    String? username,
    String? emailId,
  }) = _NewUser;

  // 修改参数类型为Object?,内部强转
  factory NewUser.fromJson(Object? json) =>
      _$NewUserFromJson(json as Map<String, dynamic>);
}

修改后就可以直接传入NewUser.fromJson:

final ResponseWrapper<NewUser> newUserWithWrapper = ResponseWrapper.fromJson(encoded, NewUser.fromJson);

补充说明

如果你的泛型T可能是列表(比如ResponseWrapper<List<NewUser>>),方案2的适配方式会更通用,不需要每次调用都写包装函数;如果只是单一对象场景,方案1更轻便,不用修改实体类。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:25:25