首页 > 解决方案 > Dart 中这个冒号背后的原因是什么

问题描述

我正在检查一些飞镖代码并查看以下内容:

  AppState.fromJson(Map<String, dynamic> json)
      : cartItems = (json['cartItems'] as List)
            .map((i) => new CartItem.fromJson(i as Map<String, dynamic>))
            .toList();

结肠背后的原因是什么?
为什么这与常规任务不同?

标签: dart

解决方案


您可以在飞镖之旅中找到更多信息:https ://dart.dev/guides/language/language-tour#classes

如果超类没有未命名的、无参数的构造函数,那么您必须手动调用超类中的构造函数之一。在冒号 (:) 之后、构造函数主体(如果有)之前指定超类构造函数。

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

// 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)');
}

在开发过程中,您可以在初始化列表中使用 assert 来验证输入。

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

推荐阅读