构造函数不满足 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
关键字,您也可以将 x
和 y
标记为可空:
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;
}
}
刚开始使用 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
关键字,您也可以将 x
和 y
标记为可空:
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;
}
}