Freezed类中使用UniqueKey导致JSON序列化失败的问题求助
解决Freezed中UniqueKey的JSON序列化问题
问题根源
UniqueKey是Dart内置类型,没有默认的JSON序列化逻辑,Freezed无法自动生成对应的fromJson/toJson代码,因此抛出序列化错误。
方案1:使用JsonConverter自动处理(推荐)
通过自定义JsonConverter,让Freezed能正确处理UniqueKey的序列化和反序列化:
- 定义转换器类
import 'package:json_annotation/json_annotation.dart'; import 'dart:ui'; class UniqueKeyConverter implements JsonConverter<UniqueKey, dynamic> { const UniqueKeyConverter(); @override UniqueKey fromJson(dynamic json) { // 反序列化时自动生成新的UniqueKey return UniqueKey(); } @override dynamic toJson(UniqueKey object) { // 序列化时忽略该字段,返回null return null; } }
- 在User类的
key字段上添加转换器注解
@freezed class User with _$User { factory User({ required String uuid, @UniqueKeyConverter() required UniqueKey key, @Default('') String name, }) = _User; factory User.initial() => User( uuid: '', key: UniqueKey(), ); factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json); }
这样Freezed生成的代码会自动通过转换器处理key字段:反序列化时生成新的UniqueKey,序列化时不会将其写入JSON。
方案2:手动忽略字段并实现fromJson
如果不需要key参与JSON序列化,可以直接忽略该字段,同时手动实现fromJson为key赋值:
@freezed class User with _$User { factory User({ required String uuid, @JsonKey(includeFromJson: false, includeToJson: false) required UniqueKey key, @Default('') String name, }) = _User; factory User.initial() => User( uuid: '', key: UniqueKey(), ); // 手动实现fromJson,避免依赖Freezed生成的代码 factory User.fromJson(Map<String, dynamic> json) => User( uuid: json['uuid'] as String, name: json['name'] as String? ?? '', key: UniqueKey(), // 反序列化时生成新的UniqueKey ); }
这种方式跳过了Freezed自动生成的_$UserFromJson,直接手动构造User实例,确保key字段被正确赋值。
内容的提问来源于stack exchange,提问作者user3808307
相关产品推荐
相关产品推荐

