冒号:在 Dart 构造函数语法中

Lit*_*key 3 dart flutter

class X extends Y {
  X(int a, int b) : super(a,b);
}
Run Code Online (Sandbox Code Playgroud)

有人能给我解释一下冒号的语法含义:吗?

cre*_*not 8

Dart 中的此功能称为“初始化列表”。
它允许您初始化类的字段,进行断言并调用超级构造函数。

这意味着它与构造函数体不同。正如我所说,您只能初始化变量并且只能访问staticmembers。您不能调用任何(非静态)方法。

好处是您还可以初始化final变量,而这是在构造函数体中无法做到的。您还可以访问传递给构造函数的所有参数,在直接在括号中初始化参数时您没有这些参数。
此外,您可以在赋值的左侧使用与引用参数的右侧参数同名的类字段。Dart 将自动使用左侧的 class 字段。
下面是一个例子:

class X {
  final int number;

  X(number) : number = number ?? 0;
}
Run Code Online (Sandbox Code Playgroud)

上述分配代码命名参数numberfinal字段this.number,如果它是非空,否则其分配0。这意味着number赋值的左侧实际上是指this.number。现在,你甚至可以做出一个永远不会失败的断言(因此是多余的,但我想解释一下一切是如何协同工作的):

class X {
  final int number;

  X(number): number = number ?? 0, assert(number != null);
}
Run Code Online (Sandbox Code Playgroud)

了解更多