Skip to content

控制流语句

控制流语句决定代码执行的顺序。Dart 提供了各种用于决策和迭代的控制结构。

条件语句

if-else

dart
int age = 18;

if (age >= 18) {
  print('成年人');
} else {
  print('未成年人');
}

// if-else if-else
int score = 85;

if (score >= 90) {
  print('A');
} else if (score >= 80) {
  print('B');
} else if (score >= 70) {
  print('C');
} else {
  print('F');
}

条件表达式

三元运算符

dart
int age = 20;
String status = age >= 18 ? '成年人' : '未成年人';
print(status);  // 成年人

空值感知运算符

dart
String? name;
String displayName = name ?? '访客';
print(displayName);  // 访客

// 如果为空则赋值
name ??= '默认名称';

switch-case

dart
String grade = 'B';

switch (grade) {
  case 'A':
    print('优秀!');
    break;
  case 'B':
    print('良好!');
    break;
  case 'C':
    print('及格');
    break;
  default:
    print('无效成绩');
}

// 多个 case
String day = '星期六';

switch (day) {
  case '星期六':
  case '星期日':
    print('周末');
    break;
  default:
    print('工作日');
}

循环

for 循环

dart
// 标准 for 循环
for (int i = 0; i < 5; i++) {
  print('计数:$i');
}

// For-in 循环
List<String> fruits = ['苹果', '香蕉', '橙子'];
for (var fruit in fruits) {
  print(fruit);
}

// forEach 方法
fruits.forEach((fruit) {
  print(fruit);
});

while 循环

dart
int count = 0;

while (count < 5) {
  print('计数:$count');
  count++;
}

do-while 循环

dart
int num = 0;

do {
  print('数字:$num');
  num++;
} while (num < 5);

循环控制

break

立即退出循环:

dart
for (int i = 0; i < 10; i++) {
  if (i == 5) {
    break;  // 当 i 为 5 时退出循环
  }
  print(i);
}
// 输出:0, 1, 2, 3, 4

continue

跳过当前迭代:

dart
for (int i = 0; i < 5; i++) {
  if (i == 2) {
    continue;  // 当 i 为 2 时跳过
  }
  print(i);
}
// 输出:0, 1, 3, 4

断言

用于调试以确保条件为真:

dart
int age = 15;
assert(age >= 18, '年龄必须为 18 岁或以上');
// 如果条件为假,在调试模式下抛出错误

模式匹配(Dart 3.0+)

Switch 表达式

dart
String grade = 'B';

String message = switch (grade) {
  'A' => '优秀!',
  'B' => '良好!',
  'C' => '及格',
  _ => '无效成绩',
};

print(message);  // 良好!

if-case

dart
Object value = 42;

if (value case int n when n > 0) {
  print('正整数:$n');
}

集合控制流

集合 if

dart
bool includeZero = true;
List<int> numbers = [
  1,
  2,
  if (includeZero) 0,
  3,
];
print(numbers);  // [1, 2, 0, 3]

集合 for

dart
List<int> original = [1, 2, 3];
List<int> doubled = [
  for (var num in original) num * 2,
];
print(doubled);  // [2, 4, 6]

展开运算符

dart
List<int> list1 = [1, 2, 3];
List<int> list2 = [4, 5, 6];
List<int> combined = [...list1, ...list2];
print(combined);  // [1, 2, 3, 4, 5, 6]

// 空值感知展开
List<int>? nullableList;
List<int> safe = [...?nullableList, 1, 2];
print(safe);  // [1, 2]

最佳实践

  1. 使用 switch 表达式以获得更清晰的代码(Dart 3.0+)
  2. 在迭代集合时优先使用 for-in而不是传统的 for 循环
  3. 使用集合 if/for进行条件列表构建
  4. 避免深层嵌套的 if-else 语句
  5. 使用提前返回来减少嵌套

完整示例

dart
void main() {
  // 成绩计算器
  List<int> scores = [85, 92, 78, 95, 88];
  
  print('=== 成绩报告 ===');
  
  for (int i = 0; i < scores.length; i++) {
    int score = scores[i];
    
    String grade = switch (score) {
      >= 90 => 'A',
      >= 80 => 'B',
      >= 70 => 'C',
      >= 60 => 'D',
      _ => 'F',
    };
    
    print('测试 ${i + 1}$score - 等级 $grade');
  }
  
  // 计算平均分
  int total = 0;
  for (var score in scores) {
    total += score;
  }
  double average = total / scores.length;
  
  print('\n平均分:${average.toStringAsFixed(2)}');
  
  // 及格/不及格状态
  String status = average >= 70 ? '及格' : '不及格';
  print('状态:$status');
  
  // 筛选及格分数
  List<int> passingScores = [
    for (var score in scores)
      if (score >= 70) score,
  ];
  
  print('\n及格分数:$passingScores');
}

下一步