首页 > 解决方案 > 为什么我们需要在声明变量时添加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. 这是我在谷歌上读到的。为什么有必要声明不可为空的变量。Vscode 总是在显示错误的变量下划线。但是吃了修饰符。当我们将变量更改为后期时,我们需要更改什么。导致其制作以下教程非常困难。设置状态没有帮助。

标签: flutterdartdart-null-safety

解决方案


这是因为 Dart 中的 null 安全性。在引入 null 安全性之前,已经编写了很多指南。可以使用 将类成员声明为可为空?,因此这是有效的,并且意味着i可以具有 value 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它是不可为空的,如果构造函数不需要它,它可能是空的。尽管如此,required如果您i通过将其声明为可空,它仍然可以在没有int? i;.


推荐阅读