【问题标题】:Why do we need to add late modifier while declaring the variables?为什么我们需要在声明变量时添加late修饰符?
【发布时间】:2021-10-28 02:45:00
【问题描述】:
这是一个普遍的问题。与编码无关。在我关注颤振教程的任何地方,我都会看到简单的变量声明。但是当我编写相同的代码时(我认为是因为更新),它需要添加后期修饰符。
late modifier can be used while declaring a non-nullable variable that's initialized after its declaration. Declaration of variables that will be initialize later is done using late modifier.
这是我在谷歌上读到的。
为什么有必要声明不可为空的变量。 Vscode 总是在显示错误的变量下划线。但是吃了修饰符。当我们将变量更改为后期时,我们需要更改什么。导致其制作以下教程非常困难。设置状态没有帮助。
【问题讨论】:
标签:
flutter
dart
dart-null-safety
【解决方案1】:
这是因为 Dart 中的 null 安全性。在引入 null 安全性之前,已经编写了很多指南。
可以使用? 将类成员声明为可为空,因此这是有效的,并且意味着i 可以具有值null,因此无需初始化其值即可:
int? i;
如果你不使用?,你仍然可以声明一个成员,但你必须给它赋值,这也是有效的:
int i=1;
但这将是无效的,因为您说i不能为空,并且您没有为其赋值:
int i;
这里出现了late 关键字。通过使用它,您“承诺” Dart,稍后您将初始化此值,例如在 initState 方法中,如下所示:
class MyWidget extends StatefulWidget {
const MyProfile({Key? key}) : super(key: key);
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
late int _i;
@override
void initState() {
super.initState();
_i = 1;
}
你必须遵守这个“承诺”,否则你会得到一个运行时错误。
另一种选择是为具有required 成员的类创建一个构造函数,它将确保这些值在创建的任何实例中都不会丢失,因此 Dart 可以接受:
class MyClass {
int i;
MyClass({required this.i});
}
在最后一个例子中,如果你省略了required 关键字,你会得到一个错误,因为i 不能为空,如果构造函数不需要它,它可能是空的。尽管如此,如果您通过像 int? i; 一样声明 i 使 i 可以为空,它仍然可以在没有 required 的情况下工作。
【解决方案2】:
late 修饰符是 dart 新的 null-safety 的一部分,它用于告诉编译器将此变量视为不可为空,并且稍后将在没有它的情况下初始化,编译器会将变量视为可空并给出错误
late String name;
@override
void initState() {
super.initState();
name = "example";//the compiler will not see this to know that you have initialized the variable
}
@override
Widget build(BuildContext context) {
if(name=="example"){
...
}
}