Как я могу вызвать функцию-оператор-массив через зеркала в Dart

Это работает в Dart-VM:

final List<String> names = [ "Bob", "JOE" ];
final InstanceMirror instanceMirror = reflect(names);

final Symbol function = new Symbol("[]");

final InstanceMirror getField = instanceMirror.invoke(function,[ 1 ]);
context = getField.reflectee;
_logger.info("Value $context"); // Shows JOE

но это не удается, если я скомпилирую его в JS. Сообщение об ошибке: `NoSuchMethodError: метод не найден: '[]' Получатель: Экземпляр 'JSArray' Аргументы: [1]'

Я также пробовал использовать elementAt вместо [], но затем я получаю: Unsupported operation: Can't use 'elementAt:1' in reflection because it is not included in a @MirrorsUsed annotation.


person Mike Mitterer    schedule 15.07.2015    source источник
comment
И вы добавили его в @MirrorsUsed? Это работает, когда вы создаете JS с помощью pub build --mode=debug?   -  person Günter Zöchbauer    schedule 15.07.2015
comment
Arrrggg.... Спасибо - вы указали мне (снова) в правильном направлении. Пожалуйста, смотрите мой ответ.   -  person Mike Mitterer    schedule 15.07.2015
comment
Я надеюсь, что Arrrggg не потому, что я указал вам направление :p   -  person Günter Zöchbauer    schedule 15.07.2015
comment
Точно нет!!!! Спасибо еще раз! Arrrgg винит себя за слепоту решения.   -  person Mike Mitterer    schedule 15.07.2015
comment
Управляйте комментарием: если можете, используйте const Symbol(...) вместо new Symbol(...).   -  person Florian Loitsch    schedule 19.07.2015


Ответы (1)


Этот класс выдал ошибку сверху (первый образец был немного уменьшен...)

const MdlComponentModelAnnotation MdlComponentModel = const MdlComponentModelAnnotation();

@MdlComponentModel
class ModelTest {

    final ObservableProperty<String> wifi = new ObservableProperty<String>("never");

    @MdlComponentModel // useless - but lights made this problem...
    final List<ObservableProperty<String>> lights = [ new ObservableProperty<String>(""), new ObservableProperty<String>("") ];

    final ObservableProperty<int> intensity = new ObservableProperty<int>(90);
}

Вот как выглядит мой `@MirrorsUsed' после того, как @Günther указал мне правильное направление:

@MirrorsUsed(metaTargets: const [ MdlComponentModelAnnotation ],
    targets: const [ 'List' ],
    symbols: const [ '[]' ])
import 'dart:mirrors';

Оба! нужны были "цели" (список) и "символы" ([])!

person Mike Mitterer    schedule 15.07.2015