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

Flutter中Retrofit泛型定义报错:fromJson方法未定义于Type类型

泛型Retrofit API序列化问题解决

问题描述

我希望通过Retrofit定义一个通用的RestApi,尝试使用的代码如下:

@RestApi()
abstract class TestAPI<T> {
  factory TestAPI(Dio dio, {String baseUrl}) = _TestAPI;

  /// GET ALL
  @GET('/models')
  Future<BaseResponse<List<T>>> getElements();
}

但运行时总是抛出错误:

the method 'fromJson' isn't defined for the type 'Type'.

问题根源在于Retrofit编译期代码生成时,无法识别泛型参数T的@JsonSerializable()注解,也就无法自动生成对应的序列化逻辑。


解决方法

方法一:通过具体子类实现泛型API

Retrofit只能为具体类型生成正确的序列化代码,因此可以定义泛型基类,再创建指定具体实体类型的子类:

  1. 定义泛型基类
abstract class BaseModelAPI<T> {
  factory BaseModelAPI(Dio dio, {String baseUrl}) = _BaseModelAPI;

  @GET('/models')
  Future<BaseResponse<List<T>>> getElements();
}
  1. 创建具体子类(指定带@JsonSerializable()的实体类)
@RestApi()
abstract class UserAPI extends BaseModelAPI<User> {
  factory UserAPI(Dio dio, {String baseUrl}) = _UserAPI;
}

这里的User是你已标记@JsonSerializable()的实体类,Retrofit生成_UserAPI时会自动调用User.fromJson完成数据解析。

方法二:手动传入序列化函数并处理解析

如果要保留泛型API类的灵活性,可以在构造时传入T的fromJson函数,手动处理响应解析:

  1. 修改API类定义,添加序列化函数参数
@RestApi()
abstract class TestAPI<T> {
  factory TestAPI(Dio dio, {String baseUrl, required T Function(Map<String, dynamic>) fromJson}) = _TestAPI;

  @GET('/models')
  Future<Response<dynamic>> getElementsRaw();
}
  1. 调用时手动解析响应
// 初始化API时传入实体类的fromJson方法
final api = TestAPI<User>(dio, fromJson: User.fromJson);
// 调用原始接口获取响应
final response = await api.getElementsRaw();
// 手动解析成目标类型
final baseResponse = BaseResponse<List<User>>.fromJson(
  response.data,
  (jsonList) => (jsonList as List).map((item) => User.fromJson(item as Map<String, dynamic>)).toList(),
);

注意:需要确保BaseResponse的fromJson方法支持泛型解析,可在@JsonSerializable()注解中添加genericArgumentFactories: true来生成支持泛型的序列化方法。


核心原因

Retrofit的代码生成是编译期执行的,此时泛型参数T只是一个类型占位符,无法获取到具体类型的fromJson方法信息。只有当T替换为具体的带注解实体类,或者手动传入序列化逻辑时,才能完成正确的JSON解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:25:19