Вызов метода динамического класса в Dart

Как и вопрос в Вызов метода динамического класса в PHP, я хочу сделать это в Дарт.

var = "name";
page.${var} = value;
page.save();

Это возможно?


person samer.ali    schedule 08.11.2012    source источник
comment
Обязательно отметьте один из этих ответов зеленой галочкой! Они оба правы.   -  person Shannon -jj Behrens    schedule 09.11.2012


Ответы (3)


С помощью зеркал можно достичь нескольких целей.

Вот пример того, как устанавливать значения классов и как динамически вызывать методы:

import 'dart:mirrors';

class Page {
  var name;

  method() {
    print('called!');
  }
}

void main() {
  var page = new Page();

  var im = reflect(page);

  // Set values.
  im.setField("name", "some value").then((temp) => print(page.name));

  // Call methods.
  im.invoke("method", []);
}

Если вам интересно, im - это InstanceMirror, который в основном отражает экземпляр page.

Есть еще один вопрос: Есть ли способ динамически вызвать метод или установить переменную экземпляра в классе в Dart?

person Kai Sellgren    schedule 08.11.2012
comment
Кто-нибудь знает, как это сделать во Flutter? Во флаттере мы не можем импортировать dart: mirros package: / - person Kavinda Jayakody; 12.01.2020

Для этого можно использовать Dart Mirror API. . Mirror API сейчас полностью не реализован, но вот как это может работать:

import 'dart:mirrors';

class Page {
  String name;
}

main() {
  final page = new Page();
  var value = "value";

  InstanceMirror im = reflect(page);
  im.setField("name", value).then((_){
    print(page.name); // display "value"
  });
}
person Alexandre Ardhuin    schedule 08.11.2012
comment
Вызов Futures.wait() здесь не имеет особого смысла. Вы можете пропустить его, и результат будет тем же. Futures.wait() возвращает Future, который завершается, когда данные действия завершаются, поэтому вам действительно нужно написать .then(), чтобы заставить его правильно работать. Конечно, теперь это работает по счастливой случайности, поскольку операции не асинхронные :) - person Kai Sellgren; 08.11.2012
comment
Спасибо за ваш комментарий. Я новичок в использовании в будущем, и меня смутило предложение await www.dartbug.com/104 - person Alexandre Ardhuin; 08.11.2012

Вы можете использовать Serializable

Например:

import 'package:serializable/serializable.dart';

@serializable
class Page extends _$PageSerializable {
  String name;
}

main() {
  final page = new Page();
  var attribute = "name";
  var value = "value";

  page["name"] = value;
  page[attribute] = value;

  print("page.name: ${page['name']}");
}
person Luis Vargas    schedule 06.02.2018