提问人:Andrey 提问时间:10/28/2023 更新时间:10/28/2023 访问量:33
如何在Dart中使用默认的非常量初始值设定项初始化类不可为空的成员?[复制]
How to initialize class non-nullable member with a default non-constant initializer in Dart? [duplicate]
问:
我正在尝试添加默认初始值设定项:
class Foo {
DateTime? date;
Foo({this.date}) {
date ??= DateTime.now();
}
}
class Foo2 {
DateTime date;
Foo2({this.date}) : date ??= DateTime.now(); // <= error
}
void main() {}
我犯规的唯一方法是使成员可为空并在构造函数主体内初始化。
有没有更好的方法(使成员不可为空)?
答:
2赞
julemand101
10/28/2023
#1
以下解决方案是可以接受的吗?它确实要求构造函数的参数 ,可以为 null,然后使用具有默认值隐含含义的值:null
class Foo {
DateTime date;
Foo({DateTime? date}) : date = date ?? DateTime.now();
}
(是的,语法是正确的。Dart 在这里足够聪明,知道我们不能在构造对象的初始化阶段为参数赋值。因此,in 将自动表示类变量而不是构造函数参数。由于在此阶段我们也无法从对象中获取任何值,因此第二个用途是使用 class 参数。date
date
date =
date
date
date
-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,用户可以查看和使用,但无法知道是否会抛出。如果可能的话,避免。late
late final
late
1赞
WebDesk Solution
10/28/2023
#3
这样,如果在创建对象时未提供日期,它将自动使用当前日期和时间。
class Foo2 {
DateTime date;
Foo2({DateTime? date}) : date = date ?? DateTime.now();
}
我希望这会有所帮助!
评论