在构造函数中初始化成员

Initializing members in a Constructor

让我们假设一个像这样的简单 class

class MyClass {
  String aString;
  DateTime aDate;

  MyClass({this.aString = '', this.aDate = DateTime.now()});
}

此代码 不起作用 因为可选参数必须是常量。我希望aDate可以为空。

我能做到:

class MyClass {
  String aString;
  DateTime aDate;

  MyClass({this.aString = ''}) : this.aDate = DateTime.now();
}

编译器接受了这一点但是在构建MyClass的实例时我不能设置aDate,像这样: var c = MyClass(aString: 'bla bla', aDate: DateTime(2021, 9, 20));

相反,它接缝我必须写:

var c = MyClass(aString: 'bla bla');
c.aDate = DateTime(2021, 9, 20);

是否真的没有更好的方法来在构造函数中使用可选命名参数初始化复杂对象并启用空安全?这只是一个简化的示例。实际上,我有 classes,其中包含许多从远程服务器获取的复杂对象。上面显示的方法迫使我写数百行赋值语句。

您可以使用以下内容:

class MyClass {
  String aString;
  DateTime aDate;

  MyClass({this.aString = '', DateTime? aDate}) : aDate = aDate ?? DateTime.now();
}

你走对了,你只需要结合上面提供的两种方法。这使用了一个可选的命名参数,它必须可以为空,并且只在它不是 null 时使用 ?? 运算符将其分配给 this.aDate。如果是 null,它会使用您想要的默认值 DateTime.now()