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

Freezed类中使用UniqueKey导致JSON序列化失败的问题求助

解决Freezed中UniqueKey的JSON序列化问题

问题根源

UniqueKey是Dart内置类型,没有默认的JSON序列化逻辑,Freezed无法自动生成对应的fromJson/toJson代码,因此抛出序列化错误。


方案1:使用JsonConverter自动处理(推荐)

通过自定义JsonConverter,让Freezed能正确处理UniqueKey的序列化和反序列化:

  1. 定义转换器类
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;
  }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 14:52:20