Dart变量与类型 #
一、变量声明 #
1.1 声明方式 #
dart
var name = 'Flutter';
String language = 'Dart';
final version = '3.16';
const pi = 3.14159;
1.2 声明方式对比 #
| 关键字 | 类型推断 | 可重新赋值 | 适用场景 |
|---|---|---|---|
| var | 是 | 是 | 局部变量 |
| 具体类型 | 否 | 是 | 明确类型 |
| final | 是 | 否 | 运行时常量 |
| const | 是 | 否 | 编译时常量 |
| late | - | 是 | 延迟初始化 |
1.3 类型推断 #
dart
var count = 10;
var name = 'Dart';
var list = [1, 2, 3];
var map = {'key': 'value'};
count = 20;
count = 'string';
二、基本数据类型 #
2.1 数值类型 #
dart
int integer = 42;
int hex = 0xFF;
int binary = 0b1010;
double floating = 3.14;
double scientific = 1.42e5;
num number = 10;
num number2 = 10.5;
int? nullableInt;
int nonNullInt = 10;
2.2 数值操作 #
dart
int a = 10;
int b = 3;
a + b;
a - b;
a * b;
a / b;
a ~/ b;
a % b;
-a.abs();
a.isEven;
a.isOdd;
a.sign;
a.floor();
a.ceil();
a.round();
a.truncate();
int max = a.clamp(5, 15);
2.3 字符串类型 #
dart
String single = 'Hello';
String double = "World";
String multiLine = '''
多行
字符串
''';
String raw = r'原始\n字符串';
String unicode = '\u{1F600}';
String concat = 'Hello' + ' ' + 'World';
String interpolated = 'Hello, $name!';
String expression = 'Sum: ${1 + 2}';
String multiline = '''
第一行
第二行
第三行
''';
2.4 字符串操作 #
dart
String text = 'Hello, Flutter!';
text.length;
text.isEmpty;
text.isNotEmpty;
text.toUpperCase();
text.toLowerCase();
text.contains('Flutter');
text.startsWith('Hello');
text.endsWith('!');
text.indexOf('Flutter');
text.substring(0, 5);
text.split(', ');
text.replaceAll('Flutter', 'Dart');
text.trim();
text.trimLeft();
text.trimRight();
text.padLeft(20, '*');
text.padRight(20, '*');
StringBuffer buffer = StringBuffer();
buffer.write('Hello');
buffer.write(' ');
buffer.write('World');
String result = buffer.toString();
2.5 布尔类型 #
dart
bool isValid = true;
bool isEmpty = false;
bool result = 1 > 0;
bool result2 = 'hello'.isNotEmpty;
bool result3 = [1, 2, 3].isNotEmpty;
三、集合类型 #
3.1 List(列表) #
dart
List<int> numbers = [1, 2, 3, 4, 5];
var fruits = <String>['apple', 'banana', 'orange'];
var mixed = [1, 'two', 3.0, true];
var empty = <int>[];
var filled = List<int>.filled(5, 0);
var generate = List.generate(5, (i) => i * 2);
numbers[0];
numbers.first;
numbers.last;
numbers.length;
numbers.add(6);
numbers.addAll([7, 8]);
numbers.insert(0, 0);
numbers.insertAll(1, [1, 2]);
numbers.remove(3);
numbers.removeAt(0);
numbers.removeLast();
numbers.removeWhere((n) => n < 3);
numbers.clear();
numbers.contains(3);
numbers.indexOf(3);
numbers.lastIndexOf(3);
numbers.indexOf(3, 2);
numbers.sort();
numbers.shuffle();
numbers.reversed.toList();
var subList = numbers.sublist(1, 4);
var joined = numbers.join('-');
3.2 Set(集合) #
dart
Set<int> numbers = {1, 2, 3, 4, 5};
var names = <String>{'Alice', 'Bob', 'Charlie'};
var empty = <int>{};
var fromList = Set.from([1, 2, 2, 3, 3]);
var identity = Set.identity();
numbers.add(6);
numbers.addAll({7, 8});
numbers.remove(1);
numbers.contains(3);
numbers.containsAll({1, 2});
var a = {1, 2, 3};
var b = {2, 3, 4};
a.intersection(b);
a.union(b);
a.difference(b);
a.lookup(2);
3.3 Map(映射) #
dart
Map<String, int> scores = {
'Alice': 90,
'Bob': 85,
'Charlie': 95,
};
var empty = <String, int>{};
var fromList = Map.fromEntries([
MapEntry('a', 1),
MapEntry('b', 2),
]);
scores['David'] = 88;
scores['Alice'] = 92;
scores.update('Bob', (v) => v + 5);
scores.update('Eve', (v) => v, ifAbsent: () => 80);
scores.remove('Charlie');
int? score = scores['Alice'];
int? missing = scores['Unknown'];
scores.containsKey('Alice');
scores.containsValue(90);
scores.length;
scores.isEmpty;
scores.isNotEmpty;
var keys = scores.keys.toList();
var values = scores.values.toList();
var entries = scores.entries.toList();
scores.forEach((key, value) {
print('$key: $value');
});
var updated = scores.map((key, value) => MapEntry(key.toUpperCase(), value * 2));
3.4 集合操作 #
dart
var numbers = [1, 2, 3, 4, 5];
var doubled = numbers.map((n) => n * 2).toList();
var filtered = numbers.where((n) => n > 2).toList();
var first = numbers.firstWhere((n) => n > 2);
var last = numbers.lastWhere((n) => n < 4);
var single = [2].singleWhere((n) => n > 1);
var sum = numbers.reduce((a, b) => a + b);
var product = numbers.fold(1, (a, b) => a * b);
var any = numbers.any((n) => n > 3);
var every = numbers.every((n) => n > 0);
var sorted = numbers.sorted((a, b) => b.compareTo(a));
var take = numbers.take(3).toList();
var skip = numbers.skip(2).toList();
numbers.forEach((n) {
print(n);
});
var expanded = [[1, 2], [3, 4]].expand((e) => e).toList();
var unique = [1, 2, 2, 3, 3, 4].toSet().toList();
四、类型转换 #
4.1 数值转换 #
dart
String str = '123';
int? parsed = int.tryParse(str);
int parsed2 = int.parse(str);
double? d = double.tryParse('3.14');
double d2 = double.parse('3.14');
int intValue = 3.7.toInt();
double doubleValue = 3.toDouble();
String strValue = 123.toString();
String fixed = 3.14159.toStringAsFixed(2);
4.2 字符串转换 #
dart
int i = 123;
String s1 = i.toString();
String s2 = '$i';
String s3 = '${i}';
double d = 3.14;
String s4 = d.toString();
String s5 = d.toStringAsFixed(2);
bool b = true;
String s6 = b.toString();
List<int> list = [1, 2, 3];
String s7 = list.toString();
4.3 集合转换 #
dart
List<int> list = [1, 2, 3, 2, 1];
Set<int> set = list.toSet();
List<int> uniqueList = set.toList();
Map<String, int> map = {'a': 1, 'b': 2};
List<String> keys = map.keys.toList();
List<int> values = map.values.toList();
List<MapEntry<String, int>> entries = map.entries.toList();
List<int> nums = [1, 2, 3];
Map<int, String> numsMap = {for (var n in nums) n: 'value_$n'};
4.4 类型检查与转换 #
dart
var value = 'Hello';
if (value is String) {
print(value.length);
}
if (value is! int) {
print('Not an integer');
}
var obj = 'Hello' as Object;
String str = obj as String;
五、Record类型(Dart 3.0+) #
5.1 Record基础 #
dart
var record = ('Alice', 25);
var record2 = (name: 'Bob', age: 30);
String name = record.$1;
int age = record.$2;
String name2 = record2.name;
int age2 = record2.age;
(String, int) person = ('Charlie', 28);
({String name, int age}) person2 = (name: 'David', age: 32);
5.2 Record解构 #
dart
var (name, age) = ('Alice', 25);
print('$name is $age years old');
var (name2, :int age2) = ('Bob', 30);
print('$name2 is $age2 years old');
Map<String, int> scores = {'Alice': 90, 'Bob': 85};
for (var (name, score) in scores.entries.map((e) => (e.key, e.value))) {
print('$name: $score');
}
六、枚举类型 #
6.1 基本枚举 #
dart
enum Color { red, green, blue }
Color favorite = Color.blue;
print(favorite);
print(favorite.index);
print(favorite.name);
Color.values.forEach((color) {
print(color);
});
6.2 增强枚举(Dart 2.17+) #
dart
enum Vehicle {
car(tires: 4),
bicycle(tires: 2),
motorcycle(tires: 2);
const Vehicle({required this.tires});
final int tires;
String get description => '$name has $tires tires';
}
print(Vehicle.car.tires);
print(Vehicle.car.description);
6.3 枚举匹配 #
dart
Color color = Color.blue;
String colorName = switch (color) {
Color.red => '红色',
Color.green => '绿色',
Color.blue => '蓝色',
};
七、类型别名 #
7.1 typedef #
dart
typedef IntList = List<int>;
typedef StringMap = Map<String, String>;
typedef Callback = void Function(String);
IntList numbers = [1, 2, 3];
StringMap translations = {'hello': '你好'};
Callback printMessage = (msg) => print(msg);
7.2 函数类型别名 #
dart
typedef Calculator = int Function(int, int);
int add(int a, int b) => a + b;
int subtract(int a, int b) => a - b;
Calculator calc = add;
print(calc(5, 3));
八、总结 #
8.1 类型系统特点 #
| 特点 | 说明 |
|---|---|
| 类型推断 | var自动推断类型 |
| 空安全 | ?表示可空,!表示非空断言 |
| 强类型 | 编译时类型检查 |
| 泛型 | List |
8.2 下一步 #
掌握了变量与类型后,让我们继续学习 函数与闭包!
最后更新:2026-03-28