在外部lib上使用dart reflectable

时间:2016-11-06 19:27:30

标签: reflection dart dart-mirrors

我需要在第三方lib上使用reflectable但它不起作用。

考虑这种情况:

图书馆A有反射声明:

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

const Reflector reflector = const Reflector();

库B具有使用反射器注释的类:

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

@reflector
class whateverz {}

现在,应用程序C需要在库B中的whateverz类上使用反射。

我的问题是可反射的lib无法看到注释的whateverz类。构建警告“reflector.dart:此反射器与任何东西都不匹配”

如果我做“print(reflector.annotatedClasses);”它在控制台中打印[]。

这可能吗?要在第三方库上注释我将最终在具有反射的应用程序中使用的类? 如果是的话,我做错了什么?

1 个答案:

答案 0 :(得分:1)

我怀疑没有在正确的主文件上执行转换。

变换器能够查找程序中的任何声明,因此如果程序中有一个库导入库B(因此也是库A),那么变换器当然应该能够为{生成镜像{1}},您应该在class whateverz中找到该镜像。

但是在转换过程中考虑的文件集是从入口点(即reflector.annotatedClasses中指定的entry_points)中的相关元素的传递关闭,所以如果你指定一个不是实际主文件的入口点,然后变换器可以使用较小(或只是不同)的库集。例如,如果您使用库A作为入口点,那么变换器将不知道库B存在(假设库A不直接或间接导入库B),因此变换器将不会发现库中的任何声明B,你不会得到相应的镜子。

如果您正在处理其他开发人员将导入和使用的库,您需要告诉他们在pubspec.yaml中包含可反射变换器并向pubspec.yaml添加元素(或检查他们正在使用已匹配所有所需入口点的通配符。)

您可以查看three_files_test.dart以查看一个小例子,其中一个文件中的反射器用于注释不同文件中的类,您可以查看meta_reflectors_test.dart以了解如何解耦反射器,目标类和其他元素甚至更多(例如,通过使用entry_points将某个反射器与某个目标类相关联,而不编辑包含目标类的文件。)