基础语法
变量、函数、控制流
变量与常量
Dart 使用 var、final 和 const 声明变量:
variables.dart
void main() {
// 类型推断
var name = 'Dart';
var version = 3.0;
// 显式类型声明
String language = 'Dart';
int year = 2011;
// final - 运行时常量
final now = DateTime.now();
// const - 编译时常量
const pi = 3.14159;
const maxItems = 100;
// late 延迟初始化
late String lateValue;
lateValue = '初始化完成';
print('$name $version'); // Dart 3.0
}
函数
Dart 函数支持多种声明方式:
functions.dart
// 基本函数
int add(int a, int b) {
return a + b;
}
// 箭头函数(单表达式函数)
int multiply(int a, int b) => a * b;
// 可选命名参数
void greet({required String name, String greeting = 'Hello'}) {
print('$greeting, $name!');
}
// 可选位置参数
String say(String from, String msg, [String? device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
// 函数作为参数
void forEach(List items, void Function(int) action) {
for (var item in items) {
action(item);
}
}
void main() {
print(add(1, 2)); // 3
print(multiply(3, 4)); // 12
greet(name: 'Dart'); // Hello, Dart!
say('Bob', 'Hello'); // Bob says Hello
}
控制流
条件语句、循环和流程控制:
control_flow.dart
void main() {
// if-else
var score = 85;
if (score >= 90) {
print('A');
} else if (score >= 80) {
print('B');
} else {
print('C');
}
// for 循环
for (var i = 0; i < 5; i++) {
print(i);
}
// for-in 循环
var items = ['apple', 'banana', 'orange'];
for (var item in items) {
print(item);
}
// forEach
items.forEach((item) => print(item));
// while 和 do-while
var count = 0;
while (count < 3) {
print(count++);
}
// switch
var day = 2;
switch (day) {
case 1:
print('Monday');
break;
case 2:
print('Tuesday');
break;
default:
print('Other day');
}
}
运算符
operators.dart
void main() {
// 算术运算符
var a = 10;
var b = 3;
print(a + b); // 13
print(a - b); // 7
print(a * b); // 30
print(a / b); // 3.333...
print(a ~/ b); // 3 (整数除法)
print(a % b); // 1 (取余)
// 类型运算符
var num = 42;
print(num is int); // true
print(num is! String); // true
// 空安全运算符
String? name;
print(name?.length); // null
print(name ?? 'default'); // default
name ??= 'Dart';
print(name); // Dart
// 级联运算符
var list = []
..add(1)
..add(2)
..add(3);
print(list); // [1, 2, 3]
// 扩展运算符
var parts = [1, 2];
var combined = [0, ...parts, 3];
print(combined); // [0, 1, 2, 3]
}
类型转换
type_conversion.dart
void main() {
// 字符串转数值
int.parse('42'); // 42
double.parse('3.14'); // 3.14
num.parse('10'); // 10
// 数值转字符串
42.toString(); // '42'
3.14159.toStringAsFixed(2); // '3.14'
255.toRadixString(16); // 'ff' 进制转换
// 类型检查和转换
dynamic value = 'hello';
if (value is String) {
print(value.length); // 5
}
// as 强制转换
(value as String).toUpperCase();
// 数值与字符串互转
String s = '100';
int i = int.parse(s);
String back = i.toString();
// List 类型转换
var list = [1, 2, 3];
var set = list.toSet();
var map = list.asMap(); // {0: 1, 1: 2, 2: 3}
// 日期时间转换
DateTime.now().toIso8601String();
DateTime.parse('2024-01-01');
}
可空类型基础
nullable.dart
void main() {
// 非空类型
String name = 'Dart';
// 可空类型(?后缀)
String? nullableName;
nullableName = null;
// 可空类型的访问
print(nullableName?.length); // null(安全访问)
// 空合并运算符 ??
String displayName = nullableName ?? 'Guest';
print(displayName); // Guest
// 空赋值运算符 ??=
nullableName ??= 'Default';
print(nullableName); // Default
// 非空断言 !(慎用)
String! definite = 'sure';
print(definite); // sure
// late 延迟初始化
late String later;
// print(later); // 错误:未初始化
later = 'now initialized';
print(later); // now initialized
}
三元运算符与 ??
ternary.dart
void main() {
// 三元运算符
var age = 20;
var status = age >= 18 ? '成人' : '未成年';
print(status); // 成人
// ?? 运算符
String? name;
var result = name ?? 'Anonymous';
print(result); // Anonymous
// ??= 赋值
String? input;
input ??= 'default';
print(input); // default
// 链式 ??
String? firstName;
String? lastName;
var fullName = firstName ?? lastName ?? 'Guest';
print(fullName); // Guest
// ?. 链式调用
String? text;
print(text?.toUpperCase()); // null
// 条件成员访问
List? numbers;
print(numbers?.first); // null
}
循环控制
loops.dart
void main() {
// 标准 for 循环
for (var i = 0; i < 5; i++) {
print(i);
}
// for-in 循环
var fruits = ['apple', 'banana', 'orange'];
for (var fruit in fruits) {
print(fruit);
}
// 带索引的 for-in
for (var i = 0; i < fruits.length; i++) {
print('$i: ${fruits[i]}');
}
// forEach
fruits.forEach((fruit) => print(fruit));
// while 循环
var count = 0;
while (count < 3) {
print(count++);
}
// do-while(至少执行一次)
var n = 0;
do {
print(n++);
} while (n < 3);
// break 和 continue
for (var i = 0; i < 10; i++) {
if (i == 3) continue; // 跳过 3
if (i == 6) break; // 跳出循环
print(i);
}
// 标签跳转
outerLoop:
for (var i = 0; i < 3; i++) {
for (var j = 0; j < 3; j++) {
if (j == 1) break outerLoop;
print('($i, $j)');
}
}
}
断言与调试
assert.dart
void main() {
// assert 断言(调试时检查条件)
var age = 20;
assert(age >= 0, '年龄不能为负数');
assert(age >= 18, '必须成年');
// 常用断言场景
// 1. 检查空值
String? name;
// assert(name != null, 'name 不能为空');
// 2. 检查类型
dynamic value = 'hello';
// assert(value is int, '必须是整数');
// 3. 检查范围
var score = 85;
assert(score >= 0 && score <= 100, '分数必须在0-100之间');
// 调试打印
print('调试信息');
printError('错误信息'); // stderr
debugPrint('调试打印'); // 开发模式专用
// 抛出异常
// throw Exception('自定义错误');
// rethrow 重抛异常
try {
try {
throw Exception('内部错误');
} catch (e) {
print('捕获: $e');
rethrow; // 重新抛出
}
} catch (e) {
print('外部捕获: $e');
}
}