如何在Dart中使用默认的非常量初始值设定项初始化类不可为空的成员?[复制]

How to initialize class non-nullable member with a default non-constant initializer in Dart? [duplicate]

提问人:Andrey 提问时间:10/28/2023 更新时间:10/28/2023 访问量:33

问:

我正在尝试添加默认初始值设定项:

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

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

void main() {}

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

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

dart 初始化初始化器列表

评论


答:

2赞 julemand101 10/28/2023 #1

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

class Foo {
  DateTime date;

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

(是的,语法是正确的。Dart 在这里足够聪明,知道我们不能在构造对象的初始化阶段为参数赋值。因此,in 将自动表示类变量而不是构造函数参数。由于在此阶段我们也无法从对象中获取任何值,因此第二个用途是使用 class 参数。datedatedate =datedatedate

-1赞 Mahmoud Mahmoud 10/28/2023 #2

最好的方法是定义以关键字为前缀的变量late

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

class Foo2 {
  late final DateTime date;
  Foo2({DateTime? date}) : date = date ?? DateTime.now();
}

void main() {
  var foo = Foo2();
  print(foo.date);
}

但使用时要小心,这些是 Dart 文档中的提示: 避免公开使用后期 final 字段

评论

0赞 julemand101 10/28/2023
请看我的例子。无需引入任何变量来解决这个问题。late
0赞 Mahmoud Mahmoud 10/28/2023
我想我误解了你的问题。但是在 Flutter 中向类注入依赖关系的最好方法是使用 late 关键字。这是因为 late 关键字允许您将变量的初始化推迟到第一次使用时。顺便说一句,我会更新我的答案。感谢您的评论。
0赞 lrn 10/30/2023
在您自己的示例中不需要,没有它,代码也可以正常工作。此外,切勿用于公共字段,它会在您的 API 中引入一个 setter,用户可以查看和使用,但无法知道是否会抛出。如果可能的话,避免。latelate finallate
1赞 WebDesk Solution 10/28/2023 #3

这样,如果在创建对象时未提供日期,它将自动使用当前日期和时间。

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

我希望这会有所帮助!