基础语法

变量、函数、控制流

变量与常量

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');
  }
}