Dart 2.12 在变量中添加了late修饰符。 这可以用于以下两种情况。
- 将您的项目迁移到零安全。
- 延时初始化一个变量。
- 您可以删除许多
initState
/constructor
调用!
1. 将您的项目迁移到零安全
在声明初始化的不可为空变量时可以使用late
修饰符。
例子
late String title; void getTitle(){ title = 'Default'; print('Title is $title'); } 复制代码
注意:
在使用变量之前的后期确保变量稍后必须初始化。否则在使用变量时可能会遇到运行时错误。
2.延时初始化一个变量
这种延时初始化在以下情况下很方便。
- 该变量可能不需要,并且初始化它的成本很高。
- 您正在初始化一个实例变量,它的初始化程序需要访问它。
// This is the program's only call to _getResult(). late String result = _getResult(); // Lazily initialized. 复制代码
在上面的示例中,如果从未使用过变量,则永远不会调用成本更高的 _getResult() 函数。
假设_getResult()
是计算该结果的非常重要的函数。 但是,如果我们将它分配给任何变量而不延时,那么_getResult()
即使我们不使用它,每次都会执行。
没有 late关键字
//START String result = _getResult(); //END 复制代码
在上面的代码中,result从未使用过,但_getResult()
依旧会被执行。
使用 late关键字
//START late String result = _getResult(); //END 复制代码
在上面的代码中_getResult()
没有被执行,因为变量result从未使用过发现了没,它是使用late修饰符声明的。
这与 Flutter 有什么关系?
以前,如果我们要创建AnimationController
,则必须在initState
构造函数中完成,因为this
, 所需的vsync
只能从方法中访问。
AnimationController anim1; @override void initState() { super.initState(); anim1 = AnimationController(vsync: this, duration: Duration(seconds: 1))..forward(); } 复制代码
现在,我们可以这样写:
late AnimationController anim = AnimationController(vsync: ``this``, duration: Duration(seconds: 1))..forward(); 复制代码
这为您节省了 6 行代码
您可以使用它从计算方法中获取初始值,或设置取决于动态值的任何默认值。
您还可以创建构建器方法,并调用它们:
late AnimationController anim1 = createAnim(seconds: 1, play: true); late AnimationController anim2 = createAnim(seconds: 2); late AnimationController anim3 = createAnim(seconds: 3); AnimationController createAnim({required int seconds, bool play = false}) { final c = AnimationController(vsync: this, duration: Duration(seconds: seconds)); if(play) c.forward(); c.addListener(() => setState((){})); return c; } 复制代码
不需要initState
,也不@override
使得每一行都有意义。
好的,关于late
关键字,我们就了解到这儿,这也是对自己的知识体系的一个梳理,如果你觉得还不错的话,可以点赞支持一下,谢谢。