【问题标题】:Use dart reflectable on external lib在外部库上使用可反射的 dart
【发布时间】:2016-11-06 19:27:29
【问题描述】:

我需要在第三方库上使用可反射,但它不起作用。

考虑这种情况:

库 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 类。构建警告“reflector.dart:这个反射器不匹配任何东西”

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

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

【问题讨论】:

    标签: reflection dart dart-mirrors


    【解决方案1】:

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

    转换器能够在您的程序中查找任何声明,因此如果您的程序中有一个库正在导入库 B(因此还有库 A),那么转换器当然应该能够为 @ 生成镜像987654323@,你应该在reflector.annotatedClasses找到那个镜像。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多