Dart变量
在Dart 中,我们有多种方式来声明和使用变量
1、使用var 来声明一个变量,Dart 会自动推断出变量类型,语法如下:
var name = "hello"; //注意:Dart语句要以分号结尾


2、声明的时候指定类型为String,如图:


注意:var 和 String等类型不能同时使用,var是自动推断,String是显示指定,如下是错误的:
var String a = "hello"; //错误,var和String不能同时使用,int等其他类型也是一样
3、如果声明的变量的值为null,需要在类型后加问号,如图:


4、如果一个对象不限于单一类型,可通过Object来指定,但是需要判断类型,如图:

注:Dart3后不推荐使用了,可通过泛型替代,除非与某些原生平台交互(如通过 dart:ffi 调用 C 函数)
5、如果一个变量在初始化后值不再改变,我们可以使用final 或const 声明它,但是final和const有点区别
- const是编译时常量,在编译之前就要指定值,不能在运行过程中指定
- final和const都是一旦设置了值就不能改变
- 如果
const变量在类级别,请将其标记为static const


下面例子中final在运行时候指定的值不会报错,但是const就会报错,如图:


任何变量都可以拥有常量值,如图:


final 关键字用于声明一个不可变的变量,但这个变量可以引用一个可变的对象。换句话说,虽然 final 变量本身不能被重新赋值,但它的字段(即对象的属性)仍然可以被修改。下面是不可变变量引用可变对象的例子,如图:


const 对象及其字段都不能被改变:它们是不可变的,下面是不可变变量引用不可变对象的例子,如图:

- 使用
const时,对象的字段也必须是final的,以确保整个对象是不可变的
6、late 关键字用于声明 延迟初始化 的非空变量,如图:

- 优势:避免使用可空类型(
String?),同时允许延迟初始化 - 如果变量可能永远不被初始化,应使用可空类型(
String?)而非late
如果使用late 声明变量没初始化,直接请求变量会报错,如图:


late变量默认为非空,因此不能声明后再次给变量赋值为null,如下:
late String name;
name = null; //报错
如果需要为null的late变量,需要显式声明类型为可空,如下:
late String? name; //加?表示可为空
name = null; //不会报错
7、通配符变量(通配符变量要求语言版本至少为 3.7)
名称为 _ 的通配符变量声明了一个非绑定的局部变量或参数;本质上,它是一个占位符。如果存在初始化器,它仍会执行,但值不可访问。在同一命名空间中可以存在多个名为 _ 的声明,而不会发生命名冲突错误,顶层声明或可能影响库隐私的成员不适用于通配符变量,块范围内的局部变量可以用通配符,如下

for (var _ in list) {} //for循环中使用
// try...catch中使用
try {
throw '!';
} catch (_) {
print('oops');
}


