我需要在第三方库上使用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类。构建警告"反射器"。dart:这个反射器不匹配任何东西"
如果我执行"print(reflector.annotatedClasses);",它会在控制台中打印[]。
这可能吗?在第三方库上注释类,我最终将在具有反射的应用程序中使用?如果是,我做错了什么?
我怀疑转换没有在正确的主文件上执行。
转换器能够查找程序中的任何声明,因此,如果程序中有一个库正在导入库B(因此也导入库a),那么转换器当然应该能够为class whateverz
生成镜像,并且您应该在reflector.annotatedClasses
中找到该镜像。
但是在转换过程中要考虑的文件集是从您的入口点(也就是说,在您的pubspec.yaml
中指定的entry_points
中的相关元素)导入的传递闭包,所以如果您指定的入口点不是实际的主文件,那么转换器可能会使用较小的(或者只是不同的)库集。例如,如果您使用库A作为入口点,那么转换器将不知道库B的存在(假设库A没有直接或间接导入库B),因此转换器将不会发现库B中的任何声明,并且您将无法获得相应的镜像。
如果您正在处理一个库,其他开发人员将导入和使用,您需要告诉他们在他们的pubspec.yaml
中包含可反射的转换器,并向entry_points
添加一个元素(或者检查他们正在使用一个通配符,该通配符已经匹配了所有所需的入口点)。
你可以查看three_files_test。请查看一个小示例,其中使用一个文件中的反射器来注释不同文件中的类,您可以查看meta_reflectors_test。来看看如何解耦反射器、目标类和其他元素,甚至更多(例如,通过使用GlobalQuantifyCapability
将特定反射器与特定目标类关联起来,而无需编辑包含目标类的文件)。