Flutter使用Freezed生成数据类遇方法未找到错误求助
问题分析与修复方案
根本原因
你遇到的错误是因为Freezed与json_serializable的配合配置不完整,核心缺失两点:
- 未引用json_serializable生成的
.g.dart文件 - 注解使用错误,且未完成完整的序列化代码生成流程
修复步骤
1. 修正代码结构
在原代码中添加access_token.g.dart的part引用,并调整注解位置(不需要在factory构造上额外加@JsonSerializable()):
import 'package:freezed_annotation/freezed_annotation.dart'; // 同时引用Freezed和json_serializable生成的两个part文件 part 'access_token.freezed.dart'; part 'access_token.g.dart'; @freezed class AccessToken with _$AccessToken { // 直接定义带JsonKey的构造函数即可 const factory AccessToken( @JsonKey(name: 'access_token') String accessToken, @JsonKey(name: 'refresh_token') String refreshToken, ) = _AccessToken; // 保留fromJson工厂方法,Freezed会自动关联json_serializable生成的代码 factory AccessToken.fromJson(Map<String, Object?> json) => _$AccessTokenFromJson(json); }
2. 确保依赖配置完整
检查pubspec.yaml中的依赖项,确保包含以下内容(版本号可根据实际情况调整):
dependencies: flutter: sdk: flutter freezed_annotation: ^2.4.1 json_annotation: ^4.8.1 dev_dependencies: flutter_test: sdk: flutter build_runner: ^2.4.4 freezed: ^2.4.5 json_serializable: ^6.7.1
3. 重新执行代码生成命令
运行以下命令强制生成所有必要的代码文件(清除旧缓存避免冲突):
flutter pub run build_runner build --delete-conflicting-outputs
错误原因详解
- Freezed负责生成数据类的核心逻辑(如不可变对象、copyWith方法等),但序列化/反序列化的代码由json_serializable生成,后者会输出
.g.dart文件,其中包含_$$_AccessTokenFromJson和_$$_AccessTokenToJson这类函数 - 你之前只引用了Freezed生成的
.freezed.dart,缺少.g.dart的引用,导致Freezed生成的代码找不到对应的序列化函数 - 错误添加的
@JsonSerializable()注解会干扰Freezed与json_serializable的配合逻辑,Freezed已经内置了对json_serializable的支持,无需额外在factory构造上添加该注解
内容的提问来源于stack exchange,提问作者genericUser
相关产品推荐
相关产品推荐

