大家好,堆栈溢出的好朋友,自学扑动和null安全。
我相信我"理解"了将变量设为空和告诉dart稍后初始化之间的区别。但是有正确的方法吗?
在什么情况下,你会选择延迟而不是使变量为空?
考虑我下面的小类,我选择了使用迟到的方法(诚然,我真的不知道为什么)你会选择同样的方法还是我应该让变量为空?
谢谢!
class Quote{
late String text;
late String author;
Quote(String text, String author){
this.text = text;
this.author=author;
}
}
这里还有第三种解决方案(有两种方法)。
可以给字段添加一个非空的默认值。
String text = '';
但是我将在这里直接初始化构造函数参数列表中的字段。
class Quote {
String text;
String author;
Quote(this.text, this.author);
}
…或者使用构造函数初始化列表:
class Quote {
String text;
String author;
Quote(String text, String author)
: text = text,
author = author;
}
使用第四个解决方案(第二个和第三个代码片段),您还可以使这些字段final
和构造函数const
为ant。
最后引用文档Classes - Language Tour | Dart:
实例变量可以是final,在这种情况下,它们必须只设置一次。在声明时,使用构造函数参数或使用构造函数的初始化列表初始化最终的非延迟实例变量(…)
如果需要在构造函数体开始后赋值最终实例变量,可以使用以下方法之一:
- 使用工厂构造函数
- 使用迟来的final,但要小心:不带初始化式的迟来的final会给API添加一个setter。
你也提到了问题的答案。如果您的业务逻辑需要检查一个值是否为空,请使用nullable变量,如果您想要一些确定的值,则使用late。例如,您可能不知道是否会像预期的那样从api获得响应。所以最好定义为可空的