所以我试图将一个小的实用程序代码从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.
这一切都运行良好,但我目前面临的问题是我需要能够在任何类的范围之外添加到注册表,基本上在库的级别。在JS中,这是作为顶级调用实现的,但在Dart中这似乎是不允许的(DartEditor说不。)
如何在Dart中执行此模式:基本上我需要为每个类注册一个函数,该函数解析为另一个类的实例,并在运行时根据第一个类的实例的runtimeType创建为其注册的一个
目前它看起来像这样:
library whatever;
class ABC {}
Registry.instance.register(ABC, () => new DEF()); // This does not work.
答案 0 :(得分:4)
您无法将代码放在库顶级执行。
您只能在库顶级创建函数,类,枚举和typedef。
在Dart中,所有内容都需要从main()
或从main()
调用的任何内容中明确调用
您可以创建类似
的功能library whatever;
class ABC {}
register() => Registry.instance.register(ABC, () => new DEF());
然后例如来自main
import 'whatever.dart' as we;
main() {
we.register();
}
或者您可以使用initialize包来声明地执行此操作。