Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 后期实例字段是否在构造函数中延迟初始化?_Flutter_Dart - Fatal编程技术网

Flutter 后期实例字段是否在构造函数中延迟初始化?

Flutter 后期实例字段是否在构造函数中延迟初始化?,flutter,dart,Flutter,Dart,我知道,延迟的初始值设定项,即直接具有初始化赋值的声明,是延迟执行的: class-Foo{ late final word=calculateWord();//将延迟初始化。 延迟的最后一句;//将不会延迟初始化。 void init(){ 语句=计算内容();//这将立即执行,即在访问语句之前。 } } 然而,我想知道的是,这种行为是如何映射到构造函数的。我假设变量是在构造函数中延迟初始化的,因为实例字段的赋值时间与初始值设定项直接用于赋值的字段的赋值时间相同 但是,我还假设构造函数主体不

我知道,
延迟的
初始值设定项,即直接具有初始化赋值的声明,是延迟执行的:

class-Foo{
late final word=calculateWord();//将延迟初始化。
延迟的最后一句;//将不会延迟初始化。
void init(){
语句=计算内容();//这将立即执行,即在访问语句之前。
}
}
然而,我想知道的是,这种行为是如何映射到构造函数的。我假设变量是在构造函数中延迟初始化的,因为实例字段的赋值时间与初始值设定项直接用于赋值的字段的赋值时间相同

但是,我还假设构造函数主体不会延迟地初始化
late
实例字段


那么,以下哪些成员是延迟初始化的(如果有的话)

Baz类{
巴兹(
//调用方的隐式赋值。
这是我的任务,
):assignmentInInitializerList=calculate(){
assignmentInConstructorBody=计算();
}
最后一次int-assignmentInConstructor;//我希望这是延迟初始化的。
late final int assignmentInInitializerList;//我希望它也可以延迟初始化。
延迟的最终int赋值inConstructorBody;//我希望不会延迟初始化它。
}
没有人懒惰 只有在使用声明进行赋值时,
late
modified字段才是惰性的

这也意味着以下情况属实:

void main(){
late final value1=calculate();//这是延迟初始化的。
延迟的最终值2;value2=calculate();//这不是延迟初始化的。
}
仅通过添加
;value2
,我将赋值与声明分离,这使它不再懒惰

实例字段 因此,构造函数中任何地方初始化的所有实例字段都不是延迟初始化的。而是在访问它们之前对它们进行初始化

演示
void main(){
//首先构造对象。
最终baz=baz(计算(‘转让人’);
//调用access来访问延迟变量,如果它们是惰性的,则初始化它们。
baz.access();
}
Baz类{
巴兹(
//调用方的隐式赋值。
这是我的任务,
):assignmentInInitializerList=计算('assignmentInInitializerList'){
assignmentInConstructorBody=计算('assignmentInConstructorBody');
}
最后整型
AssignmentUnconstructor;//我希望这是延迟初始化的。
最后整型
assignmentInInitializerList;//我希望它也被延迟初始化。
最后整型
assignmentInConstructorBody;//我希望不会延迟初始化它。
无效访问(){
打印(“访问”);
打印(“$assignmentInConstructor”
“$assignmentInInitializerList”
“$assignmentInConstructorBody”);
}
}
int计算(字符串消息){
打印(“计算$message”);
返回0;
}
执行
main
将产生以下输出:

calcuate assignmentInConstructor
calcuate assignmentInInitializerList
calcuate assignmentInConstructorBody
access
000
这意味着所有三个实例字段,无论它们在构造函数中的何处初始化,都不会延迟初始化。它们都是在访问之前计算出来的

你可以自己试一试