在外部库上使用可反射的飞镖

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) 的文件。