我正在尝试添加默认初始化程序:
class Foo {
DateTime? date;
Foo({this.date}) {
date ??= DateTime.now();
}
}
class Foo2 {
DateTime date;
Foo2({this.date}) : date ??= DateTime.now(); // <= error
}
void main() {}
我犯规的唯一方法是使成员可为空并在构造函数体内初始化。
有没有更好的方法(使成员不可为空)?
以下是可接受的解决方案吗?它确实要求构造函数的参数可以为空,然后使用具有默认值隐式含义的
null
值:
class Foo {
DateTime date;
Foo({DateTime? date}) : date = date ?? DateTime.now();
}
(是的,语法是正确的。Dart 足够聪明,知道我们不能在构造对象的初始化阶段为参数
date
分配新值。所以 date
中的 date =
会自动表示类变量 date
而不是构造函数参数 date
。并且由于我们在此阶段也无法从对象中获取任何值,因此 date
的第二次使用是使用类参数。)
最好的方法是定义带有
late
关键字前缀的变量
class Foo {
DateTime? date;
Foo({this.date}) {
date ??= DateTime.now();
}
}
class Foo2 {
late DateTime date;
Foo2({DateTime? date})
{
if (date == null)
{
this.date = DateTime.now();
}
else
{
this.date = date;
}
}
}
void main() {
var foo = Foo2();
print(foo.date);
}
但使用时要小心,这些是来自 Dart 文档的提示 避免公共使用后期最终字段