2016-11-06 1 views
1

Ich muss reflectable auf eine dritte Partei lib verwenden, aber es funktioniert nicht.Verwenden Sie Dart reflectable auf externe Lib

Betrachten Sie dieses Szenario:

Bibliothek Eine der Reflektor Erklärung hat:

class Reflector extends Reflectable { 
    const Reflector() 
     : super(invokingCapability, 
     typeRelationsCapability, 
     metadataCapability, 
     superclassQuantifyCapability, 
     reflectedTypeCapability); 
} 

const Reflector reflector = const Reflector(); 

Bibliothek B die Klassen hat, die mit dem Reflektor kommentiert werden:

import 'package:library_a/library_a.dart' show reflector; 

@reflector 
class whateverz {} 

Nun ist die Anwendung C Bedürfnisse Verwenden von Reflektion auf was auch immer Klasse innerhalb der Bibliothek B.

Mein Problem ist, dass die reflectable lib die whateverz Klasse nicht kommentiert sehen kann. Der Build warnt "reflector.dart: Dieser Reflektor passt zu nichts"

Und wenn ich "print (reflector.annotatedClasses);" Es druckt [] in der Konsole.

Ist das möglich? Um die Klassen in einer Drittanbieter-Bibliothek zu kommentieren, die ich am Ende in einer Anwendung mit Reflektion verwenden werde? Wenn ja, was mache ich falsch?

Antwort

1

Ich vermute, dass die Transformation nicht auf die richtige Hauptdatei ausgeführt wird.

Der Transformer kann jede Deklaration in Ihrem Programm nachschlagen, wenn also in Ihrem Programm eine Bibliothek vorhanden ist, die Bibliothek B (und somit auch Bibliothek A) importiert, dann sollte der Transformer sicherlich einen Spiegel dafür erzeugen können class whateverz, und Sie sollten diesen Spiegel in reflector.annotatedClasses finden.

Aber der Satz von Dateien berücksichtigen bei der Transformation genommen ist die transitive Hülle der Einfuhren aus Ihrem Einstiegspunkt (das heißt, das entsprechende Element in den entry_points in Ihrem pubspec.yaml angegeben), wenn Sie also einen Einstiegspunkt angeben, das ist nicht die eigentliche Hauptdatei, dann kann der Transformator mit einem kleineren (oder nur anderen) Satz von Bibliotheken arbeiten. Wenn Sie beispielsweise Bibliothek A als Einstiegspunkt verwenden, weiß der Transformer nicht, dass Bibliothek B existiert (vorausgesetzt, Bibliothek A importiert Bibliothek B nicht direkt oder indirekt), sodass der Transformer keine Deklarationen in der Bibliothek erkennt B und du wirst nicht die entsprechenden Spiegel bekommen.

Wenn Sie auf einer Bibliothek arbeiten, die andere Entwickler importieren und zu verwenden, müssen Sie ihnen sagen, die reflektierbaren Transformator in ihren pubspec.yaml aufzunehmen und ein Element zum entry_points (oder überprüfen Sie fügen hinzu, dass sie einen Platzhalter verwenden, die bereits passt auf alle gewünschten Einstiegspunkte).

Sie können three_files_test.dart Besuche ein kleines Beispiel zu sehen, wo ein Reflektor in einer Datei verwendet wird, Klassen in verschiedenen Dateien mit Anmerkungen versehen, und Sie können meta_reflectors_test.dart überprüfen, um zu sehen, wie Sie Reflektoren entkoppeln können, Zielklassen und andere Elemente auch mehr (z. B. mithilfe von GlobalQuantifyCapability, um einen bestimmten Reflektor einer bestimmten Zielklasse zuzuordnen, ohne die Datei zu bearbeiten, die die Zielklasse enthält).

Verwandte Themen