Flutter Freezed模型执行pub大版本升级后JsonSerializable与JsonKey注解报错问题咨询
解决Freezed模型在pub大版本升级后的注解错误问题
这问题我之前也碰到过,是因为新版本的json_annotation和json_serializable收紧了注解的使用规则,同时Freezed的集成方式也有了小调整,你原来的写法已经不符合最新规范了。下面是具体的解决步骤和修改后的代码:
错误原因分析
@JsonSerializable的使用限制:新版本的json_annotation要求这个注解只能用在普通类上,不能加在抽象类上,但你原来的代码把它加在了abstract class LeadModel上,所以触发了第一个错误。- 注解重复/顺序问题:你同时在字段上用了
@JsonKey(defaultValue: '')和@Default(''),虽然旧版本兼容,但新版本的处理逻辑更严格,可能会导致注解冲突,而且@Default已经能满足默认值的需求,不需要重复配置。
具体修改步骤
1. 调整类的定义和注解位置
- 移除
abstract关键字,新版本Freezed不需要用抽象类来定义模型 - 将
@JsonSerializable(fieldRename: FieldRename.snake)移到类顶部,和@freezed注解并列
2. 简化字段注解
- 去掉
@JsonKey中的defaultValue参数,只保留@Default来设置默认值,同时保留@JsonKey(name: ...)来映射自定义字段名
修改后的完整代码
import 'package:app_220/models/Leads/LeadFieldModel.dart'; import 'package:flutter/foundation.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:intl/intl.dart'; part 'LeadModel.freezed.dart'; part 'LeadModel.g.dart'; @freezed @JsonSerializable(fieldRename: FieldRename.snake) class LeadModel with _$LeadModel { const LeadModel._(); const factory LeadModel({ required int id, int? formId, @Default('') @JsonKey(name: 'contact__first_name') String contactFirstName, @Default('') @JsonKey(name: 'contact__last_name') String contactLastName, @Default('') @JsonKey(name: 'contact__email') String contactEmail, @Default('') @JsonKey(name: 'contact__phone') String contactPhone, int? staffId, @Default('') String staffLastName, DateTime? creationTime, @Default('') String sourceUrl, @Default('') String sourceIp, @Default(0) int viewed, List<LeadFieldModel>? leadData, }) = _LeadModel; factory LeadModel.fromJson(Map<String, dynamic> json) => _$LeadModelFromJson(json); }
最后验证
修改完成后,运行以下命令重新生成代码:
dart run build_runner build --delete-conflicting-outputs
这样就能正常生成Freezed和JSON序列化的代码,且不用再固定旧版本的包了。
内容的提问来源于stack exchange,提问作者Osmany Becerra Gonzalez
相关产品推荐
相关产品推荐

