本章是 Dart 学习的起点,涵盖变量、数据类型、运算符、控制流程、集合操作和函数等核心基础。每个知识点都配有完整的代码示例和解析,适合零基础入门。


1.1 Hello World 与环境搭建

知识点

  • Dart SDK 安装与环境配置
  • main() 函数是程序的入口
  • 使用 print() 输出内容
  • 在线运行环境:DartPad(https://dartpad.dev)

代码示例

// 这是 Dart 的入口函数
void main() {
  print('Hello, Dart!');   // 控制台输出
}

解析

  • void main() 是必须的,程序从这里开始执行。
  • print() 函数用于向控制台输出字符串。
  • 每行语句以分号 ; 结尾。

运行方式

  • 本地:dart hello.dart
  • 在线:复制到 DartPad 点击 Run

1.2 变量与数据类型

知识点

Dart 是强类型语言,但支持类型推断。常用数据类型:

  • int:整数(64位)
  • double:浮点数(64位)
  • String:字符串(UTF-16)
  • bool:布尔值(true / false
  • List:列表(数组)
  • Map:键值对集合
  • Set:无序不重复集合

变量声明方式:

  • var:自动推断类型
  • dynamic:动态类型(可在运行时改变)
  • Object:所有类的基类,类型安全

代码示例

void main() {
  // 整数
  int age = 25;
  // 浮点数
  double price = 19.99;
  // 字符串
  String name = 'Alice';
  // 布尔
  bool isStudent = true;

  // 使用 var 推断类型
  var city = 'Beijing';      // 推断为 String
  var score = 98.5;          // 推断为 double

  // dynamic 可以改变类型
  dynamic variable = 'Hello';
  print(variable);           // Hello
  variable = 123;
  print(variable);           // 123

  // List 列表
  List<int> numbers = [1, 2, 3];
  var fruits = ['apple', 'banana']; // 推断为 List<String>

  // Map 映射
  Map<String, int> scores = {'Math': 90, 'English': 85};
  var person = {'name': 'Bob', 'age': 30}; // 推断为 Map<String, Object>

  // Set 集合
  Set<String> colors = {'red', 'green', 'blue'};
}

解析

  • intdoublenum 的子类型,支持算术运算。
  • 字符串可以用单引号或双引号包裹。
  • 列表(List)索引从 0 开始,支持 add()remove() 等方法。
  • 映射(Map)中的键必须是唯一的。

1.3 常量

知识点

  • final:运行时常量,只能赋值一次。
  • const:编译时常量,在编译时确定值。

代码示例

void main() {
  final String name = 'Alice';
  // name = 'Bob';  // 错误:final 变量不能再赋值

  const double pi = 3.14159;
  // pi = 3.14;     // 错误:const 变量不可修改

  // const 赋值必须使用编译时常量
  const int max = 100;
  final DateTime now = DateTime.now();  // final 可以接受运行时的值
  // const DateTime now2 = DateTime.now(); // 错误:DateTime.now() 不是编译时常量

  // 常量列表
  final List<int> finalList = [1, 2, 3];
  finalList.add(4);           // 可以修改内容,因为 final 只限制引用不可变
  // finalList = [4, 5, 6];   // 错误:不能重新赋值

  const List<int> constList = [1, 2, 3];
  // constList.add(4);         // 错误:const 列表完全不可变
}

解析

  • final 适用于启动后不会再变化的变量(如用户ID)。
  • const 适用于固定不变的值(如圆周率、最大重试次数)。
  • const 还可以用在创建常量对象上,例如 const Text('Hello'),Flutter 中可减少重建开销。

1.4 运算符

知识点

  • 算术运算符:+ - * / % ~/(整除)
  • 关系运算符:== != > < >= <=
  • 逻辑运算符:&& || !
  • 赋值运算符:= += -= *= /= %= ~/=
  • 空值相关:??(空值合并)?.(安全调用)??=(空值赋值)
  • 级联运算符:..?.. 允许连续调用对象的方法或属性

代码示例

void main() {
  // 算术
  int a = 10, b = 3;
  print(a + b);  // 13
  print(a ~/ b); // 整除:3
  print(a % b);  // 余数:1

  // 关系
  print(a > b);   // true

  // 逻辑
  bool isAdult = true;
  bool hasTicket = false;
  print(isAdult && hasTicket); // false
  print(isAdult || hasTicket); // true

  // 赋值复合
  int c = 5;
  c += 2;  // c = c + 2
  print(c); // 7

  // 空值合并
  String? name;
  String displayName = name ?? 'Guest';
  print(displayName); // Guest

  // 安全调用
  String? upper = name?.toUpperCase();
  print(upper); // null

  // 空值赋值
  String? nickname;
  nickname ??= 'User';
  print(nickname); // User

  // 级联运算符
  var list = [1, 2];
  list
    ..add(3)
    ..add(4)
    ..remove(2);
  print(list); // [1, 3, 4]
}

解析

  • ~/ 是整数除法,结果向下取整。
  • ??:左侧为 null 时返回右侧的值。
  • ?.:调用前先判断是否 null,若为 null 则整个表达式为 null,不会执行方法。
  • .. 允许对同一个对象进行多次操作,避免重复写变量名。

1.5 字符串操作

知识点

  • 字符串插值:${expression},简单的变量可省略大括号。
  • 多行字符串:三个单引号或双引号。
  • 原始字符串:前缀 r,不转义。
  • 常用方法:lengthtoUpperCase()toLowerCase()trim()split()contains()replaceAll() 等。

代码示例

void main() {
  String name = 'Dart';
  int version = 3;

  // 字符串插值
  print('Hello, $name! Version $version');   // Hello, Dart! Version 3
  print('Sum: ${2 + 3}');                   // Sum: 5

  // 多行字符串
  String multiline = '''
  This is line 1
  This is line 2
  ''';
  print(multiline);

  // 原始字符串(不转义)
  String raw = r'Newline: \n will not be escaped';
  print(raw); // 输出: Newline: \n will not be escaped

  // 字符串方法
  String greeting = '  Hello World!  ';
  print(greeting.trim());          // 'Hello World!'
  print(greeting.toUpperCase());   // '  HELLO WORLD!  '
  print(greeting.contains('World'));// true
  List<String> parts = 'apple,banana,orange'.split(',');
  print(parts);                    // [apple, banana, orange]
  print(greeting.replaceAll('World', 'Dart')); // '  Hello Dart!  '
}

解析

  • 插值中复杂表达式必须使用 ${}
  • 多行字符串保留换行符和缩进。
  • 原始字符串 r'...' 常用于正则表达式或文件路径。

1.6 控制流程

知识点

  • if / else 条件分支
  • for 循环(标准、for-in
  • while / do-while 循环
  • switch / case(支持字符串、数值等,需要 break
  • breakcontinue

代码示例

void main() {
  // if-else
  int score = 85;
  if (score >= 90) {
    print('优秀');
  } else if (score >= 60) {
    print('及格');
  } else {
    print('不及格');
  }

  // for 循环
  for (int i = 0; i < 5; i++) {
    print(i);
  }

  // for-in 遍历列表
  var fruits = ['苹果', '香蕉', '橙子'];
  for (var fruit in fruits) {
    print(fruit);
  }

  // while
  int i = 0;
  while (i < 3) {
    print(i);
    i++;
  }

  // do-while 至少执行一次
  int j = 0;
  do {
    print(j);
    j++;
  } while (j < 3);

  // switch
  String grade = 'B';
  switch (grade) {
    case 'A':
      print('优秀');
      break;
    case 'B':
      print('良好');
      break;
    default:
      print('未知');
  }
}

解析

  • switch 必须包含 breakcontinue 以避免穿透。
  • for-in 适合遍历集合,无需索引。
  • do-while 常用于至少需要执行一次的场景(如输入验证)。

1.7 集合操作

知识点

  • List:有序可重复。常用方法:addremoveinsertindexOfsortforEachmapwherereducefold
  • Set:无序不可重复。常用方法:addremovecontainsunionintersection
  • Map:键值对。常用方法:keysvaluescontainsKeyforEachmap
  • 集合推导式:结合 iffor 生成集合。

代码示例

void main() {
  // List 操作
  List<int> numbers = [1, 2, 3];
  numbers.add(4);
  numbers.remove(2);
  print(numbers); // [1, 3, 4]
  numbers.sort();
  numbers.forEach((n) => print(n));

  // 高阶函数
  var doubled = numbers.map((n) => n * 2).toList();
  print(doubled); // [2, 6, 8]
  var evens = numbers.where((n) => n % 2 == 0).toList();
  print(evens);   // [4]

  // reduce 求和
  int sum = numbers.reduce((a, b) => a + b);
  print(sum); // 8

  // fold 带初始值
  int product = numbers.fold(1, (a, b) => a * b);
  print(product); // 12

  // Set 操作
  Set<int> setA = {1, 2, 3};
  Set<int> setB = {3, 4, 5};
  print(setA.union(setB));      // {1,2,3,4,5}
  print(setA.intersection(setB)); // {3}

  // Map 操作
  Map<String, int> scores = {'Math': 90, 'English': 85};
  scores['Science'] = 95;
  scores.forEach((subject, score) => print('$subject: $score'));
  print(scores.keys);   // (Math, English, Science)
}

解析

  • mapwhere 返回的是惰性集合,需要 .toList() 转成 List。
  • reduce 要求集合非空;fold 可提供初始值,为空时返回初始值。
  • Set 的 unionintersection 返回新 Set。

1.8 函数

知识点

  • 函数定义:返回值类型、函数名、参数列表、函数体。
  • 可选参数:位置可选参数[])、命名可选参数{})。
  • 默认参数值:在可选参数中指定。
  • 匿名函数(Lambda)。
  • 箭头函数:=> 仅适用于单表达式函数体。

代码示例

void main() {
  // 普通函数
  print(add(3, 5)); // 8

  // 位置可选参数
  print(greet('Alice', 'Mr'));   // Hello Mr Alice
  print(greet('Bob'));           // Hello Bob

  // 命名可选参数
  print(createUser('Alice', age: 25, country: 'USA'));
  print(createUser('Bob', age: 30)); // country 使用默认值

  // 匿名函数(作为参数)
  List<int> list = [1, 2, 3];
  list.forEach((item) => print(item));
  // 或使用箭头函数
  list.forEach(print);

  // 函数作为变量
  Function multiply = (int a, int b) => a * b;
  print(multiply(4, 5)); // 20
}

// 普通函数
int add(int a, int b) {
  return a + b;
}

// 位置可选参数:中括号内为可选,可设默认值
String greet(String name, [String title = '']) {
  if (title.isEmpty) return 'Hello $name';
  return 'Hello $title $name';
}

// 命名可选参数:大括号内,调用时需指定参数名
String createUser(String name, {int age = 18, String country = 'China'}) {
  return 'name: $name, age: $age, country: $country';
}

解析

  • 位置可选参数按顺序传递,可以设置默认值。
  • 命名可选参数调用时使用 paramName: value,顺序无关,更推荐用于参数较多的函数。
  • 匿名函数常用作回调,如 list.forEach((item) { ... })
  • 箭头函数 => 只能包含一个表达式,不能有花括号和分号。

总结

第一章涵盖了 Dart 基础语法的 8 个核心部分,每个知识点都提供了可直接运行的代码示例和详细解析。掌握这些内容后,你已经能够编写简单的 Dart 程序,为学习 Flutter 打下坚实基础。下一章将进入 面向对象编程(类、继承、混入等)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐