2014-02-21 1 views
0

Я пытаюсь использовать зеркала, но у меня есть ошибка в некотором простом коде.Dart зеркала выпуск. getField

import 'dart:mirrors'; 
// ----------------- 
class TestUser extends Object{ 
    String name = 'aaa'; 
    String status = 'bbb'; 
    String position = 'ccc'; 
    int age = 20; 
} 

var mapVal = new TestUser(); 
InstanceMirror mirror = reflect(mapVal); 

var futureValue = mirror.getField('age'); 
futureValue.then((imValue) => print("Field: age = ${imValue.reflectee}")); 

Результат:

Unhandled exception: 
Class 'String' has no instance getter '[email protected]'. 

NoSuchMethodError : method not found: '[email protected]' 
Receiver: "age" 
Arguments: [] 
#0  Object.noSuchMethod (dart:core-patch/object_patch.dart:45) 
#1  Symbol.getName (dart:_collection-dev/symbol.dart:64) 
#2  _n (dart:mirrors-patch/mirrors_impl.dart:59) 
#3  _LocalObjectMirror.getField (dart:mirrors-patch/mirrors_impl.dart:254) 
#4  main (file:///C:/Users/Less/IdeaProjects/testDart/console/template.dart:67:36) 
#5  _startIsolate.isolateStartHandler (dart:isolate-patch/isolate_patch.dart:216) 
#6  _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:115) 

Что это значит? Понятия не имею. Почему он берет '_name @ 0x1aab143' из String? Черная магия ...

ответ

1
var mapVal = new TestUser(); 
InstanceMirror mirror = reflect(mapVal); 
// getField() expects an instance of Symbol, not String 
var futureValue = mirror.getField(new Symbol("age")); 
// getField() returns an InstanceMirror, not a Future<InstanceMirror> 
print("Field: age = ${futureValue.reflectee}"); 

Может быть, вы обновили свой SDK, но не ваш редактор? Текущий редактор с текущим SDK показывает все это как предупреждение, что делает поиск и устранение неполадок этого кода довольно тривиальным.

+0

спасибо! ваш ответ был более полным) Я сражался с редактором Eclipse, но теперь я пытаюсь использовать IDEA. Никто из них не идеален, как я вижу. –

1

Не все в Dart является асинхронной ;-)

// mirror.getField('age'); 
InstanceMirror im = mirror.getField(#age); // needs a symbol 

// futureValue.then((imVa 
print("Field: age = ${im.reflectee}")); // getField doesn't return a future 
+0

ooh, that #symbols ... :) –

+0

Вы не получили предупреждение в DartEditor? У меня была желтая линия, когда я вставил ваш код. –

+0

Я использую плагин IDEA последние несколько недель. DartEditor делает что-то странное, например, работает dart.exe с 40% процессором все время. –