Skip to content

类型

具体类型就那几个,如有错误可以现查,本文只记录不一样的东西。

声明方法

var 隐式声明

使用var并使用具体值初始化变量,编译器会自动判断是哪种类型。

dart
var name = 'Bob'; //name 变量被推断为 String

显示声明

dart
String name = 'Bob';

非单一类型

如果一个对象不限于单一类型, 要指定 Object 类型(或 dynamic )。

dart
Object name = 'Bob';

空安全

可空变量

一言以蔽之:若允许该变量为空,则需要在类型声明后加一个?

dart
String? name  // Nullable type. Can be `null` or string.

String name   // Non-nullable type. Cannot be `null` but can be string.

可空类型如果没有初始化,其默认值为 null

不可空变量

可以不初始化,但做读取操作前需要被赋值。

dart
int lineCount;

if (weLikeToCount) {
  lineCount = countLines();
} else {
  lineCount = 0;
}

print(lineCount);

late(延迟初始化)变量

场景:你确定变量在使用之前已设置,但 Dart 推断错误的话,可以将变量标记为 late 来解决这个问题。(终端开发者给编译器擦屁股属于是)

dart
late String description;

void main() {
  description = 'Feijoada!';
  print(description);
}

Final 和 const

这两都是赋值后不可更改的玩意儿,个人认为final的存在仅仅是为了优化那一点点可有可无的性能。

dart
void main() {
  final name = 'Alice'; // 运行时常量(运行时赋值一次后不可更改)
  const age = 30;       // 编译时常量(编译时就固定写死的,不用多讲吧)

  final timeNow = DateTime.now();  // ✅ OK
  // const timeNow = DateTime.now(); ❌ 错误:运行时值不能用于 const
}

list、set、map

  • list就是dart的数组类型,使用[ ]包裹
  • set是集合类型,无序的、不允许存在两个相同的元素,使用{ }包裹
  • map则是哈希表,无需多言。