以“:”命名的构造函数

时间:2019-12-29 12:46:12

标签: flutter dart

我正在浏览Firebase的Flutter文档,发现这一行,我不知道为什么使用“:”这个符号,我是飞镖新手

 Record.fromMap(Map<String, dynamic> map, {this.reference})
     : assert(map['name'] != null),
       assert(map['votes'] != null),
       name = map['name'],
       votes = map['votes'];

为什么我不能这样初始化

Record.fromMap(Map<String, dynamic> map, {this.reference}) {
  name = map['name'],
  votes = map['votes'];
}

链接到代码实验室https://codelabs.developers.google.com/codelabs/flutter-firebase/#4

断言函数有什么作用?

1 个答案:

答案 0 :(得分:0)

这叫初始化列表,这是调用构造函数时首先要调用的东西。

来自docs

  

启动器列表

     

除了调用超类构造函数外,您还可以初始化   构造函数主体运行之前的实例变量。分离   带有逗号的初始化程序。

// Initializer list sets instance variables before
// the constructor body runs.
Point.fromJson(Map<String, num> json)
    : x = json['x'],
      y = json['y'] {
  print('In Point.fromJson(): ($x, $y)');
}
  

警告:初始化器的右侧无权访问   对此。

     

在开发过程中,您可以通过使用   初始化程序列表。

Point.withAssert(this.x, this.y) : assert(x >= 0) {
  print('In Point.withAssert(): ($x, $y)');
}
  

设置最终字段时,启动器列表非常方便。的   以下示例在初始化程序中初始化三个最终字段   清单。单击运行以执行代码。

class Point {
  final num x;
  final num y;
  final num distanceFromOrigin;

  Point(x, y)
      : x = x,
        y = y,
        distanceFromOrigin = sqrt(x * x + y * y);
}
  

重定向构造函数

     

有时候,构造函数的唯一目的是重定向到另一个   同一类中的构造函数。重定向构造函数的主体是   空,构造函数调用出现在冒号(:)后面。

class Point {
  num x, y;

  // The main constructor for this class.
  Point(this.x, this.y);

  // Delegates to the main constructor.
  Point.alongXAxis(num x) : this(x, 0);
}