Boo*_*unz 4 lazy-loading initialization lazy-initialization dart flutter
考虑有状态小部件的状态类中的以下类级别属性:
\nint myInt = widget.int;\nRun Code Online (Sandbox Code Playgroud)\nAndroid Studio 通知:“无法在初始化程序中访问实例成员‘widget’。”
\n(我明白这个错误的含义)。
\n那么如果我们添加late关键字,看起来就可以了:
\nlate int myInt = widget.int;\nRun Code Online (Sandbox Code Playgroud)\n然而......这让我感到惊讶,我\xe2\x80\x99m 允许在一行中完成所有这些工作\xe2\x80\x94 我认为后期变量必须不设置/设置为空:
\nlate int myInt;\nRun Code Online (Sandbox Code Playgroud)\n...然后在onInit内部赋值。
\n由于我没有声明何时分配,所以我不知道何时分配。
\n问题是:
\n单行 \xe2\x80\x9clate int myInt = widget.int;\xe2\x80\x9d 是否完全等同于我自己在 initState 方法中分配它?
\nDart 中的关键字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关键字。
| 归档时间: |
|
| 查看次数: |
1545 次 |
| 最近记录: |