在外部库上使用可反射的飞镖
Use dart reflectable on external lib
我需要在第三方库上使用 reflectable,但它不起作用。
考虑这种情况:
库 A 有反射器声明:
class Reflector extends Reflectable {
const Reflector()
: super(invokingCapability,
typeRelationsCapability,
metadataCapability,
superclassQuantifyCapability,
reflectedTypeCapability);
}
const Reflector reflector = const Reflector();
图书馆 B 有 class 用反射器注释的:
import 'package:library_a/library_a.dart' show reflector;
@reflector
class whateverz {}
现在应用程序 C 需要在库 B 中的任何 class 上使用反射。
我的问题是可反射库看不到注释的 whateverz class。构建警告 "reflector.dart: This reflector does not match anything"
如果我这样做 "print(reflector.annotatedClasses);" 它会在控制台中打印 []。
这可能吗?要在我最终将在具有反射的应用程序中使用的第三方库上注释 classes 吗?
如果是,我做错了什么?
我怀疑没有在正确的主文件上执行转换。
转换器能够在您的程序中查找任何声明,因此如果您的程序中有一个库正在导入库 B(因此也导入库 A),那么转换器肯定能够生成镜像对于 class whateverz
,你应该在 reflector.annotatedClasses
.
中找到那个镜像
但是转换期间考虑的文件集是从您的入口点导入的传递闭包(即您的 pubspec.yaml
中指定的 entry_points
中的相关元素),因此,如果您指定的入口点不是实际的主文件,那么转换器可能会使用较小的(或只是不同的)一组库。例如,如果您使用库 A 作为入口点,那么转换器将不知道库 B 存在(假设库 A 不直接或间接导入库 B),因此转换器不会发现库中的任何声明B 并且你不会得到对应的镜像
如果您正在开发其他开发人员将导入和使用的库,您需要告诉他们在他们的 pubspec.yaml
中包含可反射变换器并向 entry_points
添加一个元素(或检查他们使用的通配符是否已经匹配所有所需的入口点)。
您可以查看 three_files_test.dart to see a tiny example where a reflector in one file is used to annotate classes in different files, and you can check out meta_reflectors_test.dart 了解如何解耦反射器、目标 classes 和其他元素(例如,通过使用 GlobalQuantifyCapability
关联某个反射器使用特定目标 class 而无需编辑包含目标 class) 的文件。
我需要在第三方库上使用 reflectable,但它不起作用。
考虑这种情况:
库 A 有反射器声明:
class Reflector extends Reflectable {
const Reflector()
: super(invokingCapability,
typeRelationsCapability,
metadataCapability,
superclassQuantifyCapability,
reflectedTypeCapability);
}
const Reflector reflector = const Reflector();
图书馆 B 有 class 用反射器注释的:
import 'package:library_a/library_a.dart' show reflector;
@reflector
class whateverz {}
现在应用程序 C 需要在库 B 中的任何 class 上使用反射。
我的问题是可反射库看不到注释的 whateverz class。构建警告 "reflector.dart: This reflector does not match anything"
如果我这样做 "print(reflector.annotatedClasses);" 它会在控制台中打印 []。
这可能吗?要在我最终将在具有反射的应用程序中使用的第三方库上注释 classes 吗? 如果是,我做错了什么?
我怀疑没有在正确的主文件上执行转换。
转换器能够在您的程序中查找任何声明,因此如果您的程序中有一个库正在导入库 B(因此也导入库 A),那么转换器肯定能够生成镜像对于 class whateverz
,你应该在 reflector.annotatedClasses
.
但是转换期间考虑的文件集是从您的入口点导入的传递闭包(即您的 pubspec.yaml
中指定的 entry_points
中的相关元素),因此,如果您指定的入口点不是实际的主文件,那么转换器可能会使用较小的(或只是不同的)一组库。例如,如果您使用库 A 作为入口点,那么转换器将不知道库 B 存在(假设库 A 不直接或间接导入库 B),因此转换器不会发现库中的任何声明B 并且你不会得到对应的镜像
如果您正在开发其他开发人员将导入和使用的库,您需要告诉他们在他们的 pubspec.yaml
中包含可反射变换器并向 entry_points
添加一个元素(或检查他们使用的通配符是否已经匹配所有所需的入口点)。
您可以查看 three_files_test.dart to see a tiny example where a reflector in one file is used to annotate classes in different files, and you can check out meta_reflectors_test.dart 了解如何解耦反射器、目标 classes 和其他元素(例如,通过使用 GlobalQuantifyCapability
关联某个反射器使用特定目标 class 而无需编辑包含目标 class) 的文件。