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
相关产品推荐
相关产品推荐

