此代码来自颤动画廊,我试图理解和改编它。我会知道这种语法意味着什么:
class DemoItem<T> {
DemoItem({
this.valueName,
this.hintName,
this.valueSurname,
this.hintSurname,
this.builder,
this.valueToString
}) : textController = new TextEditingController(text: valueToString(valueName));
特别是我知道构造函数之后的冒号是什么意思以及是否有一种方法来定义另一个TextEditingController,除了已经定义的那个。
答案 0 :(得分:26)
:
之后的部分称为“初始化列表。它是一个,
- 分隔的表达式列表,可以访问构造函数参数并可以分配给实例字段,甚至是final
实例字段这对于用计算值初始化最终字段很方便。
初始化列表也用于调用: ..., super('foo')
之类的其他构造函数。
由于关于Dart版本1.24,初始化列表也支持assert(...)
,这对于检查参数值很方便。
初始值设定项列表无法从this
读取,因为超级构造函数需要在访问this
之前完成,但可以分配给this.xxx
。
指出用户693336的评论中提到:
这也意味着初始化程序列表在构造函数体之前执行。此外,所有超类的初始化列表都在执行任何构造函数之前执行。
答案 1 :(得分:2)
要详细说明其他答案并完成语法,还可以为构造函数提供一个真实的主体以及初始化程序代码
NonNegativePoint(this.x, this.y) : assert(x >= 0), assert(y >= 0) {
print('I just made a NonNegativePoint: ($x, $y)');
}
^这里的断言发生在执行身体之前
另一种用例是在主体执行之前为最终字段分配值
final String x;
final String y;
Point.fromJson(Map<String, num> json) : x = json['x'], y = json['y'] {
print('In Point.fromJson(): ($x, $y)');
}