【问题标题】:Dart, Can't call Generic's methodDart,不能调用通用的方法
【发布时间】:2019-04-21 11:55:15
【问题描述】:

我正在尝试创建一个抽象数据模型,我在其中传递数据并键入 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)));
  }
}

【问题讨论】:

    标签: generics dart flutter generic-programming


    【解决方案1】:

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

    你可以用你想调用的方法参数化你的类:

    class DataList<T> {
      final bool success; 
      dynamic data;
      T Function(Object) fromJson;
    
      DataList({
        this.success,
        List<dynamic> data,   
        this.fromJson;
      }) : data = castDataToList(data);
    
      factory DataList.fromJson(Map<String, dynamic> json, T fromJson(Object o)) {
         return DataList(
            success: json['success'],
            data: json['data'],
            fromJson: fromJson,
        );
      }
    
      List<T> castDataToList(jsonData) =>
          [for (var x in jsonData) fromJson(x)];
    }
    

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

    var dataList = DataList<Foo>.fromJson(someJsonMap, Foo.fromJson);
    

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

    【讨论】:

    • 如何使用这个类?
    • T 动态函数(对象) fromJson;这条线是什么意思? T 动态 ?
    • 构造函数 - Foo.fromJson(Map&lt;String, dynamic&gt; json) - 似乎不起作用,只有静态方法 - static Foo fromJson(Map&lt;String, dynamic&gt; json)。为什么?
    【解决方案2】:

    要将 Irn 答案与构造函数一起使用,请尝试像这样传递它们

    (Map<String, dynamic> json) => Foo.fromJson(Map<String, dynamic> json);
    

    【讨论】:

      猜你喜欢
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 2023-04-05
      • 1970-01-01
      • 2013-04-19
      • 2016-02-09
      相关资源
      最近更新 更多