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



相关文章
N..
|
25天前
|
Dart
Dart语言中类的定义和使用
Dart语言中类的定义和使用
N..
10 0
|
3月前
|
Dart 数据安全/隐私保护
Dart笔记:Dart 语言中的存取器及其用法解析
Dart笔记:Dart 语言中的存取器及其用法解析
49 0
N..
|
25天前
|
自然语言处理 Dart 算法
Dart语言中函数的定义
Dart语言中函数的定义
N..
10 0
|
8月前
|
API Kotlin
Kotlin中扩展函数、infix关键字、apply函数和DSL的详解
Kotlin中扩展函数、infix关键字、apply函数和DSL的详解
75 0
|
6月前
|
Java Android开发 开发者
Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(上)
Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(上)
44 0
|
6月前
|
存储 Java 编译器
Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(下)
Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(下)
32 0
|
6月前
|
存储 Dart JavaScript
【Dart语言解密】想要深入了解Dart语法和类型变量吗?
【Dart语言解密】想要深入了解Dart语法和类型变量吗?
129 0
|
10月前
|
存储 缓存 Dart
Dart中的factory关键字用法
Dart中的factory关键字用法
|
编译器 Swift 开发者
对Swift中some和any关键字的理解
在最新Swift版本中(Xcode14,Swift5.7),如果协议中有使用泛型,则如果要将此协议作为参数类型,必须使用any关键字进行修饰。其实在Swift5.1中也引入过一个some关键字,any和some都适用于协议,这两个关键字从语义上和写法上对泛型的使用进行了优化。
829 0
|
存储 编译器 测试技术
Swift 之关键字总结
在Swift官方文档的词汇结构中, 有非常多的关键字, 它们被用于声明中、语句中、表达式中、类中、模式中, 还有以数字符号#开头的关键字, 以及特定上下文环境使用的关键字。 本文中涉及的代码可以在这里下载代码资源。
430 0