在 dart 中的类定义之后在库级别执行代码

Pet*_*StJ 4 dart

所以我试图将一个小的实用程序代码从 JS 迁移到 Dart,并且我努力寻找如何执行以下操作:

注册表用于将 Class 映射到返回 DifferentClass 新实例的函数。

typedef DifferentClass InstanceGenerator();
Map<Type, InstanceGenerator> _registry;
_registry[ClassDefinition] = () => new DifferentClass();

// at runtime
var a = new ClassDefinition();
var b = _registry[a.runtimeType](); // should resolve to instance of DifferentClass.
Run Code Online (Sandbox Code Playgroud)

这一切都工作得很好,但我目前面临的问题是我需要能够在任何类的范围之外并且基本上在库级别添加到注册表。在 JS 中,这是作为顶级调用实现的,但在 Dart 中,这似乎是不允许的(DartEditor 说“不”)。

我如何在 Dart 中执行此模式:基本上,我需要为每个类注册一个函数,该函数解析为另一个类的实例,并在运行时根据第一个类实例的运行时类型创建为其注册的函数。

目前它看起来像这样:

library whatever;
class ABC {}
Registry.instance.register(ABC, () => new DEF()); // This does not work.
Run Code Online (Sandbox Code Playgroud)

Gün*_*uer 5

您不能将要在库顶层执行的代码放在其中。您只能在库顶层创建函数、类、枚举和 typedef。在 Dart 中,所有内容都需要从main()调用的任何内容中显式调用main()

您可以创建一个类似的函数

library whatever;
class ABC {}
register() => Registry.instance.register(ABC, () => new DEF()); 
Run Code Online (Sandbox Code Playgroud)

然后例如从 main

import 'whatever.dart' as we;

main() {
  we.register();
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用初始化包以声明方式执行此操作。