Freezed代码生成报错:无法解析hashCode的@JsonKey注解
问题:Freezed生成文件时出现@JsonKey注解解析错误
生成Freezed文件时遇到以下错误:
line 1, column 4214 of package:derstakip_2/models/lat_models.freezed.dart: Could not resolve annotation for `int get hashCode`. ╷ 1 │ @JsonKey(ignore: true) │ ^^^^^^^^^^^^^^^^^^^^^^ ╵
尝试重写MappedLesson类的hashCode getter,但问题未解决。仅在MappedLessonObject上使用了@freezed注解,其余类为继承类,Freezed暂不支持继承类。相关代码如下:
import 'package:derstakip_2/moor/tables.dart'; import 'package:drift/drift.dart' as drift; import 'package:freezed_annotation/freezed_annotation.dart'; part 'lat_models.freezed.dart'; part 'lat_models.g.dart'; @freezed class MappedLessonObject with _$MappedLessonObject { factory MappedLessonObject({ required MappedLesson lesson, required List<MappedTopic> topics, }) = _MappedLessonObject; factory MappedLessonObject.fromJson(Map<String, dynamic> json) => _$MappedLessonObjectFromJson(json); } class MappedLesson extends MLesson { MappedLesson({ required this.userIds, required super.id, required super.name, }); final List<String> userIds; @override int get hashCode => id.hashCode ^ name.hashCode ^ userIds.hashCode; factory MappedLesson.fromJson(Map<String, dynamic> json, {drift.ValueSerializer? serializer}) { serializer ??= drift.driftRuntimeOptions.defaultSerializer; return MappedLesson( id: serializer.fromJson<String>(json['id']), name: serializer.fromJson<String>(json['name']), userIds: serializer.fromJson<List<String>>(json['userIds']), ); } @override Map<String, dynamic> toJson({drift.ValueSerializer? serializer}) { serializer ??= drift.driftRuntimeOptions.defaultSerializer; return <String, dynamic>{ 'id': serializer.toJson<String>(id), 'name': serializer.toJson<String>(name), 'userIds': serializer.toJson<List<String>>(userIds), }; } MappedLesson copyWith({String? id, String? name, List<String>? userIds}) => MappedLesson( id: id ?? this.id, name: name ?? this.name, userIds: userIds ?? this.userIds, ); }
解决方案
错误原因是Freezed生成MappedLessonObject代码时,会自动给嵌套类MappedLesson的hashCode getter添加@JsonKey(ignore: true)注解,但MappedLesson类未导入该注解所在的包,导致注解无法被解析。
解决步骤:
- 在
MappedLesson类的导入部分添加freezed_annotation导入:import 'package:freezed_annotation/freezed_annotation.dart'; - 给
MappedLesson的hashCodegetter添加@JsonKey(ignore: true)注解:@override @JsonKey(ignore: true) int get hashCode => id.hashCode ^ name.hashCode ^ userIds.hashCode;
这样生成的Freezed代码就能正确识别该注解,解决报错问题。另外也可以考虑让MappedLesson类配合json_serializable注解生成序列化代码,确保序列化逻辑的一致性。
内容的提问来源于stack exchange,提问作者Ataberk
相关产品推荐
相关产品推荐

