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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:48:28