关于dart中的late关键字,你了解多少?

简介: Dart 2.12 在变量中添加了late修饰符。 这可以用于以下两种情况。将您的项目迁移到零安全。延时初始化一个变量。您可以删除许多initState/constructor调用!

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关键字,我们就了解到这儿,这也是对自己的知识体系的一个梳理,如果你觉得还不错的话,可以点赞支持一下,谢谢。



相关文章
|
10月前
|
数据安全/隐私保护 Docker 容器
docker pull 相关配置
通过本文的介绍,您已经了解了如何通过镜像源配置、登录私有仓库、设置网络代理以及其他优化策略来提升 `docker pull`命令的效率和可靠性。这些配置不仅能够显著加快镜像下载速度,还能确保在不同网络环境下的稳定性。通过合理使用这些配置,您可以更好地管理和优化Docker环境中的镜像拉取操作。
1161 18
|
11月前
|
开发框架 监控 JavaScript
解锁鸿蒙装饰器:应用、原理与优势全解析
ArkTS提供了多维度的状态管理机制。在UI开发框架中,与UI相关联的数据可以在组件内使用,也可以在不同组件层级间传递,比如父子组件之间、爷孙组件之间,还可以在应用全局范围内传递或跨设备传递。
332 2
|
C++
C++ 默认参数与引用传递:语法、用法及示例
C++ 允许函数参数具有默认值,简化调用。例如,`void myFunction(string country = "Norway")` 中`country`默认为"Norway"。默认参数仅适用于函数参数,不包括返回值。引用传递是另一种传递方式,函数直接访问变量内存,允许修改原值,提高效率。`void swapNums(int &x, int &y)` 中`x`和`y`为引用参数。了解这些特性可提升代码可读性和性能。
364 0
|
Web App开发 存储
解决 Failed to read the ‘localStorage‘ property from ‘Window‘: Access is denied...
解决 Failed to read the ‘localStorage‘ property from ‘Window‘: Access is denied...
1092 0
|
关系型数据库 Docker Python
什么是Docker Volume?
摘要:Docker Volume,通常翻译为数据卷,用于保存持久化数据。当我们将数据库例如MySQL运行在Docker容器中时,一般将数据通过Docker Volume保存在主机上,这样即使删除MySQL容器,数据依然保存在主机上,有效保证了数据的安全性。
4416 1
|
机器学习/深度学习 人工智能 Swift
PAI x ModelScope: 在PAI使用ModelScope模型
在当前的人工智能领域,特别是大语言模型、文生图等领域,基于预训练模型完成机器学习模型的开发部署已成为重要的应用范式,开发者们依赖于这些先进的开源预训练模型,以简化机器学习应用的开发并加速创新。
|
消息中间件 负载均衡 NoSQL
消息队列 NSQ
消息队列 NSQ
395 0
|
移动开发 数据库 Android开发
不止 Android!Compose Multiplatform 来了
不止 Android!Compose Multiplatform 来了
569 0
|
机器学习/深度学习 算法 数据安全/隐私保护
图片/视频去水印代码(毕业设计)
图片/视频去水印代码(毕业设计)
图片/视频去水印代码(毕业设计)