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、Map<K, V>

8.2 下一步 #

掌握了变量与类型后,让我们继续学习 函数与闭包

最后更新:2026-03-28