2016-11-06 11 views
1

サードパーティ製のlibでリフレクタブルを使用する必要がありますが、動作しません。外部ライブラリでダーツ反射を使用する

は、このシナリオを検討してください。

ライブラリAは、リフレクタ宣言を有する:

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

@reflector 
class whateverz {} 

次に、アプリケーションCのニーズ:

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

const Reflector reflector = const Reflector(); 

ライブラリBは、リフレクタでアノテートされたクラスを有しますライブラリB内にある任意のクラスのリフレクションを使用する。

私の問題は、リフレクション可能なlibはwhateverzクラスが注釈されていないことです。ビルドは "reflector.dart:このリフレクタは何にもマッチしません"

"print(reflector.annotatedClasses);"それはコンソール内で[]を表示します。

これは可能ですか?第三者libのクラスに注釈を付けると、アプリケーションでリフレクションを使用することになりますか? はいの場合、私は何を間違っていますか?

答えて

1

私は、変換が正しいメインファイルで実行されていないと思われます。

変圧器はプログラム内の宣言を調べることができるので、ライブラリB(したがってライブラリA)をインポートするライブラリ内にライブラリがある場合、変圧器は必ずミラーを生成する必要がありますclass whateverzであり、そのミラーはreflector.annotatedClassesにあるはずです。

ただし、変換時に考慮するファイルのセットは、エントリポイント(つまり、pubspec.yamlに指定されたentry_pointsの関連要素)からのインポートの推移的クロージャです。実際のメインファイルではなく、変圧器はより小さな(あるいはまったく異なる)ライブラリで動作するかもしれません。たとえば、ライブラリAをエントリポイントとして使用すると、トランスフォーマはライブラリBが存在することを認識しません(ライブラリAがライブラリBを直接的または間接的にインポートしないと仮定して)ので、トランスフォーマはライブラリの宣言を検出しませんあなたは対応する鏡を手に入れません。

あなたは他の開発者がインポートして使用するライブラリで作業している場合、あなたはそれらのpubspec.yamlで反射可能変圧器を含んでおり、entry_pointsに要素を追加するためにそれらを教えて(あるいは、彼らはすでに、ワイルドカードを使用していることを確認する必要がありますすべての目的のエントリポイントに一致します)。

あなたは1つのファイルにリフレクタは異なるファイル内のクラスに注釈を付けるために使用された小さな例を参照することthree_files_test.dartをチェックアウトすることができ、そしてあなたが反射、対象クラス、およびその他の要素を分離する方法を参照してくださいmeta_reflectors_test.dartをチェックアウトすることができさえ(例えば、GlobalQuantifyCapabilityを使用して特定のリフレクタを特定のターゲットクラスに関連付けることによって、ターゲットクラスを含むファイルを編集することなく)。

関連する問題