使用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
相关产品推荐
相关产品推荐

