如何向含List<T>的Flutter类动态传递T.fromJson()?
解决Flutter中泛型ListResponse的JsonSerializable序列化问题
你遇到的核心问题是泛型类ListResponse<T>无法直接在fromJson中动态传入T.fromJson,因为泛型在编译期无法确定具体类型。解决方法是修改fromJson工厂方法的签名,让它接收一个用于转换T类型的函数参数,再传递给生成的序列化代码。
步骤1:修改ListResponse类的fromJson方法
调整ListResponse的工厂方法,添加一个参数来接收T类型的fromJson函数:
part "list_response.g.dart"; @JsonSerializable(genericArgumentFactories: true) class ListResponse<T> extends BaseResponse { List<T> data; ListResponse({ required super.message, required super.success, required this.data, }); // 新增fromJsonT参数,用于转换单个T类型对象 factory ListResponse.fromJson( Map<String, dynamic> json, T Function(Map<String, dynamic>) fromJsonT, ) => _$ListResponseFromJson(json, fromJsonT); }
注意:这里可以去掉
T extends JsonSerializable的约束,因为JsonSerializable是注解而非父类,约束反而会限制灵活性。如果需要强制类型有fromJson方法,可以自定义一个抽象接口来约束。
步骤2:运行代码生成命令
执行build_runner命令生成序列化代码:
flutter pub run build_runner build
生成的_$ListResponseFromJson会自动使用你传入的fromJsonT函数,将data数组中的每个JSON对象转换为T类型实例。
步骤3:调用示例
假设你有一个用JsonSerializable注解的User类:
part "user.g.dart"; @JsonSerializable() class User { final String id; final String name; User({required this.id, required this.name}); factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json); }
解析ListResponse<User>时,直接传入User.fromJson作为参数:
// 假设apiResponseJson是接口返回的JSON Map final listResponse = ListResponse<User>.fromJson(apiResponseJson, User.fromJson);
额外说明
- 如果
BaseResponse作为抽象父类,确保它的序列化代码也正确生成,子类会自动继承父类的字段序列化逻辑。 - 若需要支持
toJson,同样可以在ListResponse中添加带泛型参数的toJson方法,生成代码时会自动处理。
内容的提问来源于stack exchange,提问作者YannMLD
相关产品推荐
相关产品推荐

