Как вызвать именованный конструктор из универсальной функции в Dart / Flutter - PullRequest
4 голосов
/ 19 марта 2019

Я хочу иметь возможность создавать объект внутри обобщенной функции.Я попробовал следующее:

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 Ответ

4 голосов
/ 19 марта 2019

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...