Передача типа класса в качестве переменной в Dart

Можно ли передать тип класса как переменную в Dart?

Я пытаюсь сделать что-то следующим образом:

class Dodo
{
  void hello() {
    print("hello dodo");
  }
}

void main() {

var a = Dodo;
var b = new a();
b.hello();

}

в python аналогичный код будет работать нормально. В Dart я получаю сообщение об ошибке new a(), жалуясь, что a не является типом.

Можно ли использовать объекты класса в качестве переменных? Если нет, то каков рекомендуемый обходной путь?


person rodrigob    schedule 15.04.2014    source источник


Ответы (3)


Вы можете использовать API зеркал:

import 'dart:mirrors';

class Dodo {
  void hello() {
    print("hello dodo");
  }
}

void main() {
  var dodo = reflectClass(Dodo);

  var b = dodo.newInstance(new Symbol(''), []).reflectee;
  b.hello();
}

Может быть, его можно написать более компактно, особенно выражение new Symbol('').

person Ozan    schedule 15.04.2014
comment
я пытаюсь использовать текст в качестве имени класса, думаю, это не должно работать, как я могу это сделать? - person Frank Leal; 27.06.2019

Другой способ сделать это - передать замыкание, а не класс. Тогда можно обойтись без зеркал. например

a = () => new Dodo();
...
var dodo = a();
person Alan Knight    schedule 16.04.2014
comment
Обратите внимание, что такое решение, хотя и очень полезное, может быть не таким элегантным, если вам нужно передать много параметров. - person Smily; 04.11.2019
comment
Почему нет? Вы можете просто сделать что-то вроде: a = (String myString) => new Dodo(myString);, а затем var dodo = a("hello"); - person Ian Spryn; 21.08.2020

что вы можете сделать, это:

const dynamic a = Dodo; // or dynamic a = Dodo;
var b = new a();
b.hello();

Это отлично работает для меня; Наслаждайтесь!

person Dieu le veut Nkenye    schedule 26.06.2021