Skip to content

Dart 语言数据类型详解(新手向)

一、基础数据类型

1. 数字类型

dart
int age = 25;          // 整数(范围随平台变化)
double price = 19.99;  // 双精度浮点数
num value = 3.14;      // 可接收int/double的超类

新手注意点:

  • 在 Web 平台编译为 JS 时,int 范围缩小至 -2^53 ~ 2^53-1(网页3)
  • 十六进制声明需加 0x 前缀,如 0xFF 对应十进制 255(网页4)
  • num.parse() 可将字符串转为数字,需处理格式错误异常(网页4)

2. 字符串

dart
String s1 = '单引号'; 
String s2 = "双引号";
String s3 = '''多行
字符串''';          // 三引号支持换行

易错陷阱:

  • 转义字符需用 \,如 I'm 要写成 'I\'m'(网页3)
  • 字符串拼接优先用 $变量 插值法,而非 + 运算符(网页4)
  • UTF-16 编码可能导致某些特殊字符处理异常(网页4)

3. 布尔类型

dart
bool isActive = true;  // 只有true/false两个值

特殊说明:

  • 非布尔值不能隐式转换:if(1) 会报错(网页3)
  • 空字符串的 isEmpty 返回 true(网页3)

二、集合类型

1. List(列表)

dart
List<int> numbers = [1, 2, 3];  // 推荐类型声明
var dynamicList = [1, 'a'];     // 默认List<dynamic>

操作要点:

  • const 创建编译时常量列表(完全不可变)
  • 预分配容量提升性能:List.filled(1000, 0)(网页5)
  • 展开运算符 ... 可合并列表(网页5)

2. Set(集合)

dart
Set<String> fruits = {'apple', 'banana'};
var uniqueNumbers = {1, 2, 3};  // 字面量语法

隐藏特性:

  • 元素唯一性验证在运行时完成,重复添加不会报错但会被忽略(网页3)
  • 空Set需显式声明类型:Set<String> s = {}(否则会被识别为Map)(网页3)

3. Map(映射)

dart
Map<String, int> scores = {'Alice': 90};
var capitals = Map();  // 旧式构造函数

注意事项:

  • 键类型必须一致,{1: 'a', 'b': 2} 会导致后续操作异常(网页3)
  • 使用 ?? 处理不存在的键:scores['Bob'] ?? 0(网页5)
  • putIfAbsent() 方法可安全添加新键值对(网页3)

三、类型系统特性

1. 类型推断

dart
var a = 10;         // 推断为int
var b = [1, 2, 3];  // 推断为List<int>

常见误区:

  • 未初始化的 var 变量默认是 dynamic 类型(网页6)
  • 动态列表需显式声明:List<dynamic>(否则添加不同类型元素会污染列表)(网页6)

2. 动态类型

dart
dynamic value = 'text';
value = 42;  // 允许改变类型

风险提示:

  • 绕过类型检查可能导致运行时错误(如对 null 调用方法)(网页6)
  • 优先使用明确类型,仅在处理 JSON 等不确定结构数据时使用(网页6)

3. 空安全

dart
int? nullableInt;  // 可空声明
String name = '';  // 非空必须初始化

必须掌握:

  • ! 断言运算符:nullableInt!.abs()(需确保非空)
  • 安全调用链:user?.profile?.age ?? 0(网页5)

四、新手进阶技巧

1. 类型检查

dart
if (value is String) {
  print(value.length);
}

2. 类型转换

dart
int.parse('42')          // String转int
double.tryParse('3.14')  // 安全转换

3. 实用操作

dart
// 合并列表去重
var combined = [...list1, ...list2].toSet().toList();

// 条件添加元素
var list = [
  'base',
  if (isVIP) 'VIP',
  for (var i=0; i<3; i++) 'item$i'
];

4. 性能优化

  • 优先使用 final 声明不可变集合
  • 大批量数据操作时使用 Uint8List 等类型化数组(网页4)

实践建议:
尝试实现:将 List<dynamic> 转换为 List<String> 时,使用 map((e) => e.toString()) 并处理可能的 null 值