Freezed类包含enum属性时调用jsonEncode序列化报错如何解决?
问题原因说明
你遇到的报错不是Freezed的框架bug,是配置疏漏导致的问题。
核心错误点
- 枚举类型字段没有显式声明类型,仅通过
@Default注解传入枚举默认值,Freezed代码生成器无法自动推导该字段为枚举类型,导致序列化时没有触发枚举的@JsonValue转换逻辑,直接把枚举实例当成普通对象处理,触发不支持序列化的报错。
修复步骤
- 给枚举字段显式声明类型,修改后的代码如下:
import 'package:freezed_annotation/freezed_annotation.dart'; part 'input.freezed.dart'; part 'input.g.dart'; @freezed class Input with _$Input { const factory Input({ @Default(0) int seconds, @Default(0) double bolus, @Default(0) double infusion, // 显式声明字段类型为InputType,不需要required的话可以去掉required修饰符 @Default(InputType.Bolus) required InputType currentInputType, }) = _Input; factory Input.fromJson(Map<String, dynamic> json) => _$InputFromJson(json); } enum InputType { @JsonValue("bolus") Bolus, @JsonValue("infusion") Infusion, }
- 重新执行代码生成命令,覆盖旧的生成文件:
flutter pub run build_runner build --delete-conflicting-outputs
验证
修改完成后再调用jsonEncode(someInput)就可以正常序列化,currentInputType字段会按照@JsonValue配置转换成对应的字符串值。
内容的提问来源于stack exchange,提问作者Luca Cras
相关产品推荐
相关产品推荐

