我有一个类,我想在其中调用一个静态方法来初始化一些东西。我试着从全局范围调用它,比如这个简化的例子:
class MyClass{
static bool initialized = false;
static void init(){
initialized = true;
}
}
MyClass.init();
void main() async {
// Do something useful
}
这会导致以下错误:
- 函数必须有一个明确的参数列表
- 名称"MyClass"已定义
我发现有点奇怪的是,如果我让init()
方法返回一些东西,并将结果分配给一个变量,它就会起作用:
class MyClass{
static bool initialized = false;
static bool init(){
initialized = true;
return true;
}
}
bool _dummy = MyClass.init();
void main() async {
// Do something useful
}
为什么会这样?是否有更好的解决方法从全局范围调用staticvoid方法?
原因是静态变量在Dart中是延迟求值的,所以它们在第一次访问时会首先得到一个值。
这意味着:中的MyClass.init()
bool _dummy = MyClass.init();
仅当有东西试图访问变量_dummy
时才被执行。这也意味着以下在全球范围内:
MyClass.init();
在Dart中没有任何意义,因为这段代码永远不会被执行,因为没有对代码的引用。
这种设计的原因可以在Dart语言规范:中找到描述
带有初始化表达式的静态变量声明是延迟初始化的。
之所以给出惰性语义,是因为我们不希望使用一种语言来定义昂贵的初始化计算,从而导致应用程序启动时间过长。这对于Dart来说尤其重要,因为它必须支持客户端应用程序的编码
https://dart.dev/guides/language/specifications/DartLangSpec-v2.10.pdf