变量

一、变量

1.1 变量初始化

1
2
3
4
5
6
7
var name = 'Bob';  // name变量被推断成String

Object n1 = "Bob"; //不受单一变量限制

dynamic n2 = 124;
n2 = "Bob"; //编译器不会对 dynamic 变量进行任何成员访问或方法调用的校验

dynamic 和 var区别

var声明类型在初始化即被推断且固定(类型锁定),之后不能在赋其他的类型

dynamic完全允许类型改变,且关闭类型检查。

1.2 空安全

Dart语言强制执行可靠的空安全

当一个值为null时,访问其属性或者调用方法时,就会发生空引用错误。

1
2
// 特殊情况
null.toString()

空安全三个关键变化

  • 变量可空

    1
    2

    String? name;
  • 变量使用之前必须初始化,dart不会默认非可空类型设置初始值

  • 你不能在一个带有表达式的对象上访问属性或调用方法可空类型

1
2
String? name = getUserName(); // name 是可空类型 String?
int length = name.length; // ❌ 编译错误

1.3 默认值

未初始化的可空类型变量初始值为 null。 即使是数值类型的变量也初始为 null

1
2
int? lineCount;
assert(lineCount == null);

你不必在变量之前初始化,但是在使用前必须为其赋值

1
2
3
int lastTime;
lastTime = 20;
print(lastTime);

顶层变量和类变量是惰性初始化的;变量第一次被使用时才会运行初始化代码。

1.4 延迟变量

使用场景:

  • 声明一个非空变量
1
late String description;
  • 懒加载变量

当你将变量标记为 late 并在声明时初始化它, 那么初始化器会在变量第一次被使用时运行。

1.5 最终和常量

如果你永远不打算改变一个变量,使用 final 或 const,可以代替 var 使用,也可以在类型声明时额外使用。一个 final 变量只能被设置 只有一次;一个 const 变量是一个编译时常量。

const 和 final的区别:

特征 final const
赋值时机 运行时 编译时
是否必须编译时常量 不需要 必须
内存分配 每次运行可能不同 同一个值只分配一份(常量折叠)
可用在类级变量 可以(实例或静态) 只能静态(static const)
集合类型 可变内部元素(如果集合本身是 final) 集合本身及内部元素均不可变

1.6 通配符变量

一个名为 _ 的通配符变量声明了一个非绑定的局部变量或参数,本质上是一个占位符。

1
2
3
4
main() {
var _ = 1;
int _ = 2;
}

本文作者:finyou

本文链接:http://finyou.top/2026/04/07/flutter/dart/var/

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

ESC 关闭 | 导航 | Enter 打开
输入关键词开始搜索