为什么我们在声明变量时需要添加late修饰符?

doc*_*doc 11 dart flutter dart-null-safety

这是一个普遍问题。与编码无关。在我关注 flutter 教程的每个地方,我都会看到简单的变量声明。但是当我编写相同的代码时(我认为是因为更新),它需要添加 Late 修饰符。 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. 这是我在谷歌上读到的。为什么需要声明不可为 null 的变量。vscode 总是在显示错误的变量下划线。但吃了修饰剂。当我们改变变量到late的时候我们需要改变什么。因为它使得接下来的教程变得非常困难。设置状态没有帮助。

Pet*_*tai 26

这是因为 Dart 中的空安全性。在引入空安全之前,已经写了很多指南。可以使用 声明一个类成员为可为空?,因此这是有效的,并且意味着i可以具有值null,因此允许在不初始化其值的情况下使用:

int? i;
Run Code Online (Sandbox Code Playgroud)

如果你不使用?,你仍然可以声明一个成员,但是你必须给它赋值,这也是有效的:

int i=1;
Run Code Online (Sandbox Code Playgroud)

但这将是无效的,因为您说它i不能为空,并且您没有为其赋值:

int i;
Run Code Online (Sandbox Code Playgroud)

关键词来了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;
  }
Run Code Online (Sandbox Code Playgroud)

你必须遵守这个“承诺”,否则你会得到运行时错误。

另一种选择是为具有required成员的类创建一个构造函数,它将确保这些值在创建的任何实例中都不会丢失,因此 Dart 可以接受:

class MyClass {
    int i;
    MyClass({required this.i});
}
Run Code Online (Sandbox Code Playgroud)

在最后一个示例中,如果省略required关键字,则会收到错误,因为i不可为空,并且如果构造函数不需要它,则它可能为空。required尽管如此,如果您i通过将其声明为 nullable 来使其为 null,那么即使没有 ,它也可以工作int? i;


Oma*_*oud 2

Late 修饰符是 dart 新空安全的一部分,它用于告诉编译器将此变量视为不可为空,并且稍后将进行初始化,如果没有它,编译器会将变量视为可空并给出错误

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"){

      ...
    }
  }
Run Code Online (Sandbox Code Playgroud)