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

如何向含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:42:51