【Dart 语言学习教程】 第一章:基础语法
·
本章是 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'};
}
解析
int和double是num的子类型,支持算术运算。- 字符串可以用单引号或双引号包裹。
- 列表(
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,不转义。 - 常用方法:
length、toUpperCase()、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)break和continue
代码示例
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必须包含break或continue以避免穿透。for-in适合遍历集合,无需索引。do-while常用于至少需要执行一次的场景(如输入验证)。
1.7 集合操作
知识点
- List:有序可重复。常用方法:
add、remove、insert、indexOf、sort、forEach、map、where、reduce、fold。 - Set:无序不可重复。常用方法:
add、remove、contains、union、intersection。 - Map:键值对。常用方法:
keys、values、containsKey、forEach、map。 - 集合推导式:结合
if、for生成集合。
代码示例
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)
}
解析
map、where返回的是惰性集合,需要.toList()转成 List。reduce要求集合非空;fold可提供初始值,为空时返回初始值。- Set 的
union和intersection返回新 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 打下坚实基础。下一章将进入 面向对象编程(类、继承、混入等)。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)