使用Freezed构建自定义Model时无法生成fromJson代码的问题
解决Freezed结合json_serializable处理自定义模型的序列化问题
方案一:为Post类添加json_serializable支持
这是最直接的处理方式,让json_serializable自动生成Post的序列化代码:
- 修改Post类代码,添加json_serializable相关注解和标准方法:
import 'package:json_annotation/json_annotation.dart'; part 'post.g.dart'; @JsonSerializable() class Post { final int userId; final String title; Post(this.userId, this.title); // 替换原有自定义构造函数为json_serializable生成的方法 factory Post.fromJson(Map<String, dynamic> json) => _$PostFromJson(json); Map<String, dynamic> toJson() => _$PostToJson(this); }
- 运行代码生成命令生成Post的序列化代码:
flutter pub run build_runner build --delete-conflicting-outputs
- 保持PostState代码不变,再次运行上述build_runner命令即可正常生成序列化代码。
方案二:使用自定义JsonConverter(无需修改Post类)
如果不想改动Post类的现有结构,可以通过自定义转换器告诉json_serializable如何处理Post类型:
- 创建PostConverter类:
import 'package:json_annotation/json_annotation.dart'; import 'post.dart'; class PostConverter implements JsonConverter<Post, Map<String, dynamic>> { const PostConverter(); @override Post fromJson(Map<String, dynamic> json) { return Post.fromJsonMap(json); } @override Map<String, dynamic> toJson(Post object) { return object.toJson(); } }
- 在PostState的posts字段上添加转换器注解:
@freezed class PostState with _$PostState { factory PostState({ @Default(1) int page, @PostConverter() required List<Post> posts, @Default(false) bool isLoading, }) = _PostState; const PostState._(); factory PostState.fromJson(Map<String, dynamic> json) => _$PostStateFromJson(json); }
- 重新运行build_runner命令:
flutter pub run build_runner build --delete-conflicting-outputs
错误原因说明
json_serializable默认仅支持基础类型和已配置json_serializable的类,你的Post类未被识别为可序列化类型,因此无法自动生成List<Post>的序列化逻辑。上述两种方案都是明确告知json_serializable如何完成JSON与Post对象的互相转换。
内容的提问来源于stack exchange,提问作者Ian Cho
相关产品推荐
相关产品推荐

