2016-06-09 5 views
1

Sagen wir, ich habe folgende Annotation und 2 Klassen:reflektierbaren: myAnnotation.annotatedClasses anderes Ergebnis CmdApp <> Client

class AppModel extends Reflectable { 
    final String name; 
    const AppModel([this.name]) 
     : super(newInstanceCapability, metadataCapability); 
} 

const appModel = const AppModel(); 

@appModel 
class ImGonnaBePickedUp { 

} 

@AppModel(' :(') 
class AndImNotPickedUpOnServer_IDoOnWebClient { 

} 

main() { 
    appModel.annotatedClasses // that's what I mean by "Picked Up". 
} 

Auf CmdApp Seite (Server): nur AndImNotPickedUpOnServer_IDoOnWebClient in appModel.annotatedClasses gegeben.

Auf der Web-Seite sind beide Klassen angegeben.

Lange Rede, kurzer Sinn, wie lade ich Klassen, die mit direkten const constructor Anrufen wie im obigen Beispiel @AppModel(' :(') (sowohl für CmdApp und Web) kommentiert abgerufen?

Antwort

2

seit Version 0.5.4 reflektierbaren Klassen nicht unterstützt Konstrukteure mit Argumenten

Dies scheint in reflectable documentation:

Fußnoten: 1. Derzeit ist die einzige Einrichtung, die unterstützt wird, ist, wenn das Metadatenobjekt ein ist Instanz einer direkten Unterklasse der Klasse [Reflectable], sagen MyReflectable, und diese Unterklasse definiert einen Const-Konstruktor, der Nullargumente nimmt. Dies stellt sicher, dass jede als Metadaten verwendete Unterklasse von Reflectable eine Singleton-Klasse ist, was bedeutet, dass das Verhalten der Instanz durch Generieren von Code in der Klasse ausgedrückt werden kann. Verallgemeinerungen dieses Setups können in der Zukunft unterstützt werden, wenn zwingende Anwendungsfälle auftreten.

eine mögliche Lösung könnte sein, eine zweite Anmerkung zu verwenden, den Namen, zum Beispiel zu handhaben:

import 'package:reflectable/reflectable.dart'; 
import 'package:drails_commons/drails_commons.dart'; 

class AppModel extends Reflectable { 
    const AppModel() 
     : super(newInstanceCapability, metadataCapability); 
} 

const appModel = const AppModel(); 

class TableName { 

    final String name; 

    const TableName(this.name); 

} 

@appModel 
class ImGonnaBePickedUp { 

} 

@appModel 
@TableName(' :(') 
class AndImNotPickedUpOnServer_WorksOnWebClient { 

} 

main() { 
    print(appModel.annotatedClasses); // that's what I mean by "Picked Up". 

    print(new GetValueOfAnnotation<TableName>() 
     .fromDeclaration(appModel.reflectType(AndImNotPickedUpOnServer_WorksOnWebClient)).name); 
} 

Hinweis: Ich bin auch drails_common package

mit