Flutter中如何用Freezed生成返回Map<String,String>的toJson方法
Flutter使用Freezed实现返回
Map<String, String>类型toJson()的方法 Freezed默认生成的toJson()方法返回值固定为Map<String, dynamic>,要得到Map<String, String>类型的返回结果,可按下面两种方式实现:
方式一:在模型类内重写toJson方法
直接在手写的Freezed类代码中重写toJson,指定返回类型,内部调用默认生成的序列化逻辑后做类型转换即可,示例代码:import 'package:freezed_annotation/freezed_annotation.dart'; part 'user_info.freezed.dart'; part 'user_info.g.dart'; @freezed class UserInfo with _$UserInfo { const factory UserInfo({ required String userId, required String nickName, // 即使有int、bool这类非String字段也可以正常转换 required int age, }) = _UserInfo; factory UserInfo.fromJson(Map<String, dynamic> json) => _$UserInfoFromJson(json); @override Map<String, String> toJson() { final defaultJson = _$$UserInfoImplToJson(this as _UserInfo); // 所有value统一转String,避免运行时类型异常 return defaultJson.map((k, v) => MapEntry(k, v.toString())); } }这种方式的优势是调用时和普通toJson没有区别,直接调用实例的
toJson()就能拿到目标类型的结果。方式二:编写通用扩展方法做转换
如果项目里有多个类需要做这类转换,不需要每个类都重写方法,写一个Map的通用扩展即可:extension DynamicMapToStringMap on Map<String, dynamic> { Map<String, String> toStringValueMap() { return map((key, value) => MapEntry( key, value is String ? value : value.toString(), )); } }使用时直接调用Freezed默认生成的toJson后追加转换方法即可:
final stringJson = userInfo.toJson().toStringValueMap();这种方式不会侵入原有模型类的代码,灵活度更高。
注意:不要直接修改Freezed自动生成的
.freezed.dart、.g.dart文件内的逻辑,这类文件在每次执行flutter pub run build_runner build命令时都会被重新生成覆盖,自定义逻辑必须写在自己维护的业务代码文件中。
内容的提问来源于stack exchange,提问作者Tushar Asodariya
相关产品推荐
相关产品推荐

