Flutter:在有状态小部件中延迟初始化“小部件点”类级变量 - 发生了什么事?

Boo*_*unz 4 lazy-loading initialization lazy-initialization dart flutter

考虑有状态小部件的状态类中的以下类级别属性:

\n
int myInt = widget.int;\n
Run Code Online (Sandbox Code Playgroud)\n

Android Studio 通知:“无法在初始化程序中访问实例成员‘widget’。”

\n

(我明白这个错误的含义)。

\n

那么如果我们添加late关键字,看起来就可以了:

\n
late int myInt = widget.int;\n
Run Code Online (Sandbox Code Playgroud)\n

然而......这让我感到惊讶,我\xe2\x80\x99m 允许在一行中完成所有这些工作\xe2\x80\x94 我认为后期变量必须不设置/设置为空:

\n
late int myInt;\n
Run Code Online (Sandbox Code Playgroud)\n

...然后在onInit内部赋值。

\n

由于我没有声明何时分配,所以我不知道何时分配。

\n

问题是:

\n

单行 \xe2\x80\x9clate int myInt = widget.int;\xe2\x80\x9d 是否完全等同于我自己在 initState 方法中分配它?

\n

use*_*613 6

Dart 中的关键字late有 2 种不同的用法,融合为一个关键字。


一种用法,例如late int i

这种用法是众所周知的:延迟赋值直到稍后。这最常用于使字段不可为空,即使您可能不会立即获得该值。我相信你对这个用法很熟悉。

第二种用法,例如late int i = 0

这是为了延迟值计算,直到该字段被访问为止。当计算该值的成本很高时,这非常有用,因此您可能希望延迟其计算,直到第一次需要它为止。官方文档中是这么说的:

当你这样做时,初始化器就会变得懒惰。它不是在实例构造完成后立即运行,而是在第一次访问字段时延迟并延迟运行。换句话说,它的工作方式与顶级变量或静态字段上的初始化程序完全相同。当初始化表达式成本高昂并且可能不需要时,这会很方便。

所以基本上,取决于您是否立即分配一个值(在同一行上),Dart 将决定您使用两种用法中的哪一种。如果写入late int i则为第一次使用,如果写入late int i = 0则为late int i = calculateValue()第二次使用:延迟计算,直到i第一次访问该字段时。就像lateinitKotlin 或lazySwift 中一样。

现在回到你的案例。通过在与关键字相同的行上分配一个值late,您将使用第二种用法,基本上是“延迟初始化”,直到第一次访问该字段。当它被访问时,此类将被实例化,因此(到那时)您可以使用该this关键字。