【问题标题】:Named constructors with ":" [duplicate]带有“:”的命名构造函数[重复]
【发布时间】:2019-12-29 12:46:12
【问题描述】:

我正在通过 Firebase 获取 Flutter 文档并找到了这一行,我不知道为什么使用“:”这个符号,我是 dart 新手

 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

断言函数有什么作用?

【问题讨论】:

  • 您不能在构造函数中初始化final 成员,因为构造函数主体只是另一个使用构造函数参数调用的方法,它可以调用类中的任何非静态方法。这意味着该成员将不再是final,因为它将在以后更改。对于其余部分,您可以看到已经回答了您的问题的问题(将其标记为重复)。

标签: flutter dart


【解决方案1】:

它被称为初始化列表,它是调用构造函数时首先调用的东西。

来自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);
}

【讨论】:

    猜你喜欢
    • 2013-12-12
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    相关资源
    最近更新 更多