如何在 Dart 中使用默认的非常量初始化器来初始化类的非空成员?

问题描述 投票:0回答:2

我正在尝试添加默认初始化程序:

class Foo {
  DateTime? date;
  Foo({this.date}) {
    date ??= DateTime.now();
  }
}

class Foo2 {
  DateTime date;
  Foo2({this.date}) : date ??= DateTime.now(); // <= error
}

void main() {}

我犯规的唯一方法是使成员可为空并在构造函数体内初始化。

有没有更好的方法(使成员不可为空)?

dart initialization initializer-list
2个回答
0
投票

以下是可接受的解决方案吗?它确实要求构造函数的参数可以为空,然后使用具有默认值隐式含义的

null
值:

class Foo {
  DateTime date;

  Foo({DateTime? date}) : date = date ?? DateTime.now();
}

(是的,语法是正确的。Dart 足够聪明,知道我们不能在构造对象的初始化阶段为参数

date
分配新值。所以
date
中的
date =
会自动表示类变量
date
而不是构造函数参数
date
。并且由于我们在此阶段也无法从对象中获取任何值,因此
date
的第二次使用是使用类参数。)


-1
投票

最好的方法是定义带有

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 文档的提示 避免公共使用后期最终字段

© www.soinside.com 2019 - 2024. All rights reserved.