Dart,无法调用Generic的方法

Tor*_*dze 2 generics generic-programming dart flutter

我正在尝试创建一个抽象数据模型,在该模型中我传递数据并键入a,然后是返回列表,但是当我无法调用T.fromJson()方法时,请注意传递类型具有方法fromJson()

class DataList<T> {
  final bool success; 
  dynamic data;


  InfosResponse({
    this.success,
    List<dynamic> data,   
  }) {
    castDataToList(data);
  }

  factory DataList.fromJson(Map<String, dynamic> json) {
    return DataList(
      success: json['success'],
      data: json['data'],
    );
  }

  void castDataToList(jsonData) {
    this.data = List<T>.from(jsonData.map((x) => T.fromJson(x)));
  }
}
Run Code Online (Sandbox Code Playgroud)

lrn*_*lrn 6

您不能在类型变量上调用静态方法。静态方法必须在编译时已知,并且类型变量的值要到运行时才知道。

您可以使用要调用的方法对类进行参数化:

class DataList<T> {
  final bool success; 
  dynamic data;
  T dynamic Function(Object) fromJson;

  DataList({
    this.success,
    List<dynamic> data,   
    this.fromJson;
  }) {
    castDataToList(data);
  }

  factory DataList.fromJson(Map<String, dynamic> json, T fromJson(Object o)) {
     return DataList(
        success: json['success'],
        data: json['data'],
        fromJson: fromJson,
    );
  }

  void castDataToList(jsonData) {
    this.data = List<T>.from(jsonData.map((x) => fromJson(x)));
  }
}
Run Code Online (Sandbox Code Playgroud)

当您要使用Foo具有fromJson静态方法的类型的类时,可以将实例创建为:

var dataList = DataList<Foo>fromJson(someJsonMap, Foo.fromJson);
Run Code Online (Sandbox Code Playgroud)

这会将Foo.fromjson函数传递给类,然后可以在需要时使用它。