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

Flutter Freezed生成toJson未递归调用嵌套对象toJson问题求助

问题:Freezed序列化CommentDto时未深度调用UserDto.toJson()

我有以下两个使用Freezed的DTO类:

UserDto类

part 'user_dto.freezed.dart';
part 'user_dto.g.dart';

@freezed
abstract class UserDto implements _$UserDto {
  const factory UserDto({
    required String userId,
    required String userName,
    required String userImageUrl,
    String? emailAddress,
  }) = _UserDto;
  factory UserDto.fromJson(Map<String, dynamic> json) =>
      _$UserDtoFromJson(json);
  const UserDto._();

  factory UserDto.fromDomain(User user) {
    return UserDto(
      userId: user.id.getOrCrash(),
      emailAddress: user.emailAddress.getOrCrash(),
      userImageUrl: user.userImageUrl.getOrCrash(),
      userName: user.userName.getOrCrash(),
    );
  }
}

CommentDto类

part 'comment_dto.freezed.dart';
part 'comment_dto.g.dart';

@freezed
abstract class CommentDto implements _$CommentDto {
  const factory CommentDto({
    required String id,
    required String keekzId,
    required String content,
    required int likeCount,
    @JsonKey(includeToJson: true) required UserDto author,
  }) = _CommentDto;

  factory CommentDto.fromDomain(Comment comment) {
    return CommentDto(
      content: comment.commentContent.getOrCrash(),
      likeCount: comment.commentLikeCounter.getOrCrash(),
      id: comment.id.getOrCrash(),
      author: UserDto.fromDomain(comment.author),
      keekzId: comment.keekzId.getOrCrash(),
    );
  }

  factory CommentDto.fromJson(Map<String, dynamic> json) =>
      _$CommentDtoFromJson(json);
  const CommentDto._();
}

问题描述

调用CommentDto.toJson()时,仅对author字段做浅序列化,生成的代码中直接返回instance.author而非调用其toJson()方法:

Map<String, dynamic> _$$_CommentDtoToJson(_$_CommentDto instance) =>
    <String, dynamic>{
      'id': instance.id,
      'keekzId': instance.keekzId,
      'content': instance.content,
      'likeCount': instance.likeCount,
      'author': instance.author, // 未调用toJson()
    };

我期望生成的代码中该行为:

'author': instance.author.toJson(),

解决方案

步骤1:修改字段注解

更新CommentDto中author字段的@JsonKey注解,指定序列化转换器:

@JsonKey(toJson: _userDtoToJson) required UserDto author,

步骤2:添加辅助转换函数

在CommentDto类的同一文件中、类外部定义以下辅助函数:

Map<String, dynamic> _userDtoToJson(UserDto user) => user.toJson();

步骤3:重新生成序列化代码

运行build_runner命令重新生成代码:

flutter pub run build_runner build --delete-conflicting-outputs

完成后,生成的_$$_CommentDtoToJson方法中,author字段会自动调用toJson()完成深度序列化。


内容的提问来源于stack exchange,提问作者SRel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:42:44