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

使用Freezed构建自定义Model时无法生成fromJson代码的问题

解决Freezed结合json_serializable处理自定义模型的序列化问题

方案一:为Post类添加json_serializable支持

这是最直接的处理方式,让json_serializable自动生成Post的序列化代码:

  1. 修改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);
}
  1. 运行代码生成命令生成Post的序列化代码:
flutter pub run build_runner build --delete-conflicting-outputs
  1. 保持PostState代码不变,再次运行上述build_runner命令即可正常生成序列化代码。

方案二:使用自定义JsonConverter(无需修改Post类)

如果不想改动Post类的现有结构,可以通过自定义转换器告诉json_serializable如何处理Post类型:

  1. 创建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();
  }
}
  1. 在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);
}
  1. 重新运行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:35:20