在dart中构造函数后的冒号

Vin*_*ato 32 constructor dart flutter

这段代码来自颤动的画廊,我正在努力理解和改编它.我会知道这个语法意味着什么:

class DemoItem<T> {
  DemoItem({
    this.valueName,
    this.hintName,
    this.valueSurname,
    this.hintSurname,
    this.builder,
    this.valueToString

  }) : textController = new TextEditingController(text: valueToString(valueName));
Run Code Online (Sandbox Code Playgroud)

特别是我知道构造函数之后冒号什么意思,如果有一种方法来定义另一个TextEditingController,除了已经定义的那个.

先感谢您.

Gün*_*uer 46

后面的部分:称为"初始化列表.它是一个,分离的表达式列表,可以访问构造函数参数,并可以分配给实例字段,甚至是final实例字段.这对于使用计算值初始化最终字段很方便.

初始化列表也用于调用其他构造函数: ..., super('foo').

由于关于Dart版本1.24,初始化程序列表也支持assert(...)哪些方便检查参数值.

初始化程序列表无法读取,this因为超级构造函数需要在访问之前完成才this有效,但它可以分配给this.xxx.

  • 这个答案很正确,但我觉得可以通过明确指出初始化程序在构造函数主体之前运行来改进。当前答案中暗示了这一点,但值得说明。这允许在执行构造函数主体之前计算或预初始化某些字段。 (3认同)
  • 这与为构造函数提供主体并在那里初始化变量有何不同? (2认同)

bin*_*thb 13

为了详细说明其他答案并完成语法,还可以为构造函数提供一个真实的主体以及初始值设定项代码

NonNegativePoint(this.x, this.y) : assert(x >= 0), assert(y >= 0) {
    print('I just made a NonNegativePoint: ($x, $y)');
}
Run Code Online (Sandbox Code Playgroud)

^ 这里的断言发生在主体执行之前

另一个用例是在主体执行之前为最终字段赋值

final num x;
final num y;

Point.fromJson(Map<String, num> json) : x = json['x'], y = json['y'] {
    print('In Point.fromJson(): ($x, $y)'); 
}
Run Code Online (Sandbox Code Playgroud)

  • 如果初始化列表中的断言失败,构造函数的执行会停止吗? (2认同)