具有所需参数和 null 安全性的命名构造函数

Bob*_*bin 7 dart flutter dart-null-safety

以下代码无法以健全的 null 安全性进行编译,因为可以将 null 传递给初始化不可为 null 的字段myString的构造函数。

class MyClass {
  String myString;
  MyClass({@required this.myString});
}
Run Code Online (Sandbox Code Playgroud)

我希望在this.myString之后添加一个问号可以解决问题,但事实并非如此,并且会显示另一个编译错误。

默认值对我来说是没有选择的,似乎唯一的其他解决方案是这样的:

class MyClass {
  late String myString;
  MyClass({@required myString}) {
    this.myString = myString;
  }
}
Run Code Online (Sandbox Code Playgroud)

在我看来,如果有很多参数,这会降低可读性。是否有更方便的解决方案支持以此进行初始化在命名构造函数中?

Cop*_*oad 9

对于不可为 null 的类型,请使用required或提供默认值。您也可以使用late,但请确保在稍后使用它之前提供一个值。这就像一个爆炸运算符。

例子:

class Foo {
  // All are non-nullable.
  final int a;
  final int b;
  late final int c; // I trust you that you'll provide me a value later. 
  
  Foo({
    required this.a, // <-- Mark it required  
    this.b = 0, // <-- or provide a default value. 
  });
}
Run Code Online (Sandbox Code Playgroud)


CbL*_*CbL 2

如果我的想法没有错误,如果你想要一个可以从构造函数中为空的字符串参数,你可以声明一个“字符串?” 类型。

class MyClass {
  String? myString;
  MyClass({required this.myString});
}
Run Code Online (Sandbox Code Playgroud)