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

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类未导入该注解所在的包,导致注解无法被解析。

解决步骤:

  1. 在MappedLesson类的导入部分添加freezed_annotation导入:
    import 'package:freezed_annotation/freezed_annotation.dart';
    
  2. 给MappedLesson的hashCode getter添加@JsonKey(ignore: true)注解:
    @override
    @JsonKey(ignore: true)
    int get hashCode => id.hashCode ^ name.hashCode ^ userIds.hashCode;
    

这样生成的Freezed代码就能正确识别该注解,解决报错问题。另外也可以考虑让MappedLesson类配合json_serializable注解生成序列化代码,确保序列化逻辑的一致性。


内容的提问来源于stack exchange,提问作者Ataberk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:42:53