如何从Dart / Flutter中的泛型函数调用命名构造函数

时间:2019-03-19 09:00:16

标签: generics constructor dart flutter

我希望能够从通用函数内部构造一个对象。我尝试了以下方法:

abstract class Interface
{
  Interface.func(int x);
}
class Test implements Interface
{
  Test.func(int x){}
}
T make<T extends Interface>(int x)
{
  // the next line doesn't work
  return T.func(x);
}

但是,这不起作用。而且我收到以下错误消息:The method 'func' isn't defined for the class 'Type'

注意:我无法使用镜子,因为我使用的是带有飞镖的飞镖。

1 个答案:

答案 0 :(得分:2)

Dart不支持从泛型类型参数实例化。想要使用命名构造函数还是默认构造函数都没关系(T()也无效)。

服务器上可能有一种方法,其中dart:mirrors(反射)可用(尚未尝试过),但Flutter或浏览器中没有。

您需要维护类型到工厂功能的映射

void main() async {
  final double abc = 1.4;
  int x = abc.toInt();
  print(int.tryParse(abc.toString().split('.')[1]));
//  int y = abc - x;
  final t = make<Test>(5);
  print(t);
}

abstract class Interface {
  Interface.func(int x);
}

class Test implements Interface {
  Test.func(int x) {}
}

/// Add factory functions for every Type and every constructor you want to make available to `make`
final factories = <Type, Function>{Test: (int x) => Test.func(x)};

T make<T extends Interface>(int x) {
  return factories[T](x);
}