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只能为具体类型生成正确的序列化代码,因此可以定义泛型基类,再创建指定具体实体类型的子类:
- 定义泛型基类
abstract class BaseModelAPI<T> { factory BaseModelAPI(Dio dio, {String baseUrl}) = _BaseModelAPI; @GET('/models') Future<BaseResponse<List<T>>> getElements(); }
- 创建具体子类(指定带
@JsonSerializable()的实体类)
@RestApi() abstract class UserAPI extends BaseModelAPI<User> { factory UserAPI(Dio dio, {String baseUrl}) = _UserAPI; }
这里的User是你已标记@JsonSerializable()的实体类,Retrofit生成_UserAPI时会自动调用User.fromJson完成数据解析。
方法二:手动传入序列化函数并处理解析
如果要保留泛型API类的灵活性,可以在构造时传入T的fromJson函数,手动处理响应解析:
- 修改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(); }
- 调用时手动解析响应
// 初始化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
相关产品推荐
相关产品推荐

