构造函数不满足 Dart 中的空安全

Constructor doesn't satisfy null safety in Dart

刚开始使用 Dart。 DartPad 说我的代码不是 null 安全的,但我没有看到在不为 x 和 y 赋值的情况下初始化“Point”的方法,所以它应该是 null 安全的,不是吗?

void main(){
  Point p = new Point(1.0,2.0);
  print(p.x);
}

class Point {
  double x;
  double y;

  Point(double x, double y) {
    this.x = x;
    this.y = y;
  }
}

奇怪的是,如果我使用被概述为“语法糖”的东西,它就会起作用。但这不就意味着“普通方式”也应该有效吗?

void main(){
  Point p = new Point(1.0,2.0);
  print(p.x);
}

class Point {
  double x;
  double y;

  Point(this.x, this.y) {}
}

我在这里错过了什么?

Understanding null safety 中所述,您应该在 构造函数主体之前 初始化不可空字段。

更新: “常用方法”在这种情况下看起来像这样,使用 preconstructor:

class Point {
  double x;
  double y;

  Point(double x, double y) :
    this.x = x,
    this.y = y;
}

“通用方式”将不起作用,因为 Dart 无法确保您会为变量提供不可为空的值。但是,您可以使用 late 关键字告诉 Dart 您愿意。

class Point {
  late double x;
  late double y;

  Point(double x, double y) {
    this.x = x;
    this.y = y;
  }
}

如果您不想使用 late 关键字,您也可以将 xy 标记为可空:

class Point {
  double? x;
  double? y;

  Point(double x, double y) {
    this.x = x;
    this.y = y;
  }
}

在某些情况下,您可以通过添加 ?进入变量

class Point {
  double? x;
  double? y;

  Point(double x, double y) {
    this.x = x;
    this.y = y;
  }
}