Flutter使用@freezed时提示无法为Media类型的medias生成toJson代码如何解决
解决方案
错误根本原因
freezed生成Account类的toJson方法时,无法识别Media类型的序列化逻辑,导致嵌套类型的序列化代码生成失败。
具体解决步骤
- 第一步:检查
Media类的配置是否完整
如果你是把Media类单独定义在media.dart文件中,需要补充缺失的part声明:
如果你把// media.dart 文件顶部添加 import 'package:freezed_annotation/freezed_annotation.dart'; part 'media.freezed.dart'; part 'media.g.dart'; // 原有Media类代码保持不变 @freezed class Media with _$Media{ const factory Media({ required String shortCode, required int createdTime, //... })=_Media; factory Media.fromJson(Map<String, dynamic> json) => _$MediaFromJson(json); }Media类和Account类写在同一个dart文件中,则不需要单独新增part声明,只要保证Media类已经定义了fromJson工厂方法即可。 - 第二步:清除旧缓存重新生成代码
在项目根目录执行以下命令,强制覆盖旧的生成文件:flutter pub run build_runner build --delete-conflicting-outputs - 第三步(可选,前两步未解决时使用):显式开启嵌套序列化规则
给Account类的@freezed注解添加explicitToJson参数,强制freezed嵌套调用自定义类型的toJson方法:@Freezed( explicitToJson: true ) class Account with _$Account{ const factory Account({ //... required List<Media> medias, //... })=_Account; factory Account.fromJson(Map<String, dynamic> json) => _$AccountFromJson(json); }
完成上述操作后报错即可修复,Account类序列化时会自动调用每个Media实例的toJson方法完成嵌套数据转换。
内容的提问来源于stack exchange,提问作者DolDurma
相关产品推荐
相关产品推荐

