我需要在第三方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);”它在控制台中打印[]。
这可能吗?要在第三方库上注释我将最终在具有反射的应用程序中使用的类? 如果是的话,我做错了什么?
答案 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
将某个反射器与某个目标类相关联,而不编辑包含目标类的文件。)