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

Flutter使用Freezed生成数据类遇方法未找到错误求助

问题分析与修复方案

根本原因

你遇到的错误是因为Freezed与json_serializable的配合配置不完整,核心缺失两点:

  1. 未引用json_serializable生成的.g.dart文件
  2. 注解使用错误,且未完成完整的序列化代码生成流程

修复步骤

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:12:18