Flutter for OpenHarmony前置知识:Dart 语法核心知识点总结(上)

作者:爱吃大芒果
个人主页 爱吃大芒果
本文所属专栏Flutter
更多专栏
Ascend C 算子开发教程(进阶)
鸿蒙集成
OpenAgents
openJiuwen
从0到1自学C++
Dart 基础语法(Flutter 核心开发语言)
Dart 是 Google 开发的面向对象、跨平台的编程语言,也是 Flutter 框架的核心开发语言。它兼具静态类型语言的安全性和动态类型语言的灵活性,掌握 Dart 基础语法是学习 Flutter 的第一步。
相关资料
- 【2025最新】Flutter 编译开发 鸿蒙HarmonyOS 6 项目教程(Windows)
- flutter环境配置中遇到的问题
- Flutter 从0到1环境搭建指南
- 环境搭建视频
- 黑马程序员Flutter从入门到实战全套视频教程,从Dart语言到Flutter核心框架AI辅助开发,一套搞定Android、iOS、HarmonyOS及Web
- Dart 语法核心知识点总结
前期准备
-
在环境准备完成之后,在终端执行:
bashdart --version输出版本号即安装成功,示例输出:
Dart SDK version: 3.6.2 (stable) (Fri Jun 6 10:43:50 2025 +0800) on "windows_x64" -
安装Trae
-
打开 Trae并在Trae中安装指定插件




-
输出"Hello world"
dartvoid main(List<String> args) { print("Hello world"); }

一、Dart中的变量声明
1. 核心关键字:var
Dart 是强类型语言,变量的类型在第一次赋值后会被自动推断,且后续不能更改类型。
dart
var name = "爱吃大芒果"; // 自动推断为 String 类型
name = 20; // 错误,类型不匹配
2. 显式类型声明
可以直接指定变量类型,可读性更强。
dart
String name = "爱吃大芒果";
int age = 19;
易错点
- 仅声明不赋值的 var 变量会报错:
var a;(编译错误:The variable 'a' must be initialized) - 显式声明的变量也必须初始化(空安全机制要求):
String address;(编译错误:Non-nullable variable 'address' must be initialized)

二、Dart中的常量声明const
const 是编译时常量,值必须在编译阶段确定(只能是固定字面量),一旦声明不可修改,且不能为 null。

1. 核心特点
- 编译时确定值,运行时不可变
- 不可赋值为 null
- 相同值的 const 常量会复用内存(性能优化)
2. 适用场景
- 固定不变的字面量(如数字、字符串常量)
- 编译时就能确定值的场景
三、Dart中常量final
final 是运行时常量,值在运行阶段确定,一旦赋值不可修改,支持通过计算、函数返回值等方式赋值。

1. 核心特点
- 运行时确定值,赋值后不可变
- 可以为 null(但需显式声明可空)
- 每个 final 变量都是唯一的(即使值相同也会占用不同内存)
2. 适用场景
运行时才能确定值的场景(如获取当前时间、读取配置)
四、Dart中的字符串类型-String
String 是 Dart 中表示文本的类型,支持多种操作方式,使用灵活。
1. 字符串类型(String)
- 用双引号
"或 单引号'包裹内容。 - 支持字符串拼接(+ 号)、插值表达式(
${变量/表达式},变量可省略大括号)。 - 支持多行字符串:用三个单引号 / 双引号包裹。
dart
void main() {
// 单引号(不支持插值)
String str1 = 'Hello Dart';
// 双引号(支持插值)
String str2 = "Hello Flutter";
// 多行字符串(三个单/双引号)
String str3 = '''
这是多行字符串
第一行内容
第二行内容
''';
String str4 = """
多行字符串也可以用双引号
支持换行和空格
""";
print(str1);
print(str2);
print(str3);
print(str4);
}
2. 数字类型
包含两种核心类型,不支持自动类型转换,需手动调用方法转换。
- int:整数类型,如 10、-5。
- double:浮点类型,如 3.14、-2.5。
dart
void main() {
// 1. 字符串转数字
String numStr = "123";
int num1 = int.parse(numStr); // 字符串转 int
double num2 = double.parse(numStr); // 字符串转 double
// 容错转换(避免转换失败报错)
int? num3 = int.tryParse("123a"); // 转换失败返回 null
print(num3); // null
// 2. 数字转字符串
int age = 19;
String ageStr = age.toString(); // int 转 String
double pi = 3.1415;
String piStr = pi.toStringAsFixed(2); // 保留2位小数:3.14
// 3. int 转 double / double 转 int
int i = 5;
double d1 = i.toDouble(); // int 转 double:5.0
double d2 = 3.99;
int i2 = d2.toInt(); // double 转 int(直接截断小数):3
int i3 = d2.round(); // 四舍五入:4
}


五、Dart中的数字类型
包含两种核心类型,不支持自动类型转换,需手动调用方法转换。
- int:整数类型,如 10、-5
- double:浮点类型,如 3.14、-2.5
- num:包括整数类型和浮点类型
dart
void main() {
int a = 10;
int b = 3;
print(a + b); // 加法:13
print(a - b); // 减法:7
print(a * b); // 乘法:30
print(a / b); // 除法(返回 double):3.3333333333333335
print(a ~/ b); // 整数除法(取整):3
print(a % b); // 取余:1
}
六、Dart中的布尔类型
只有两个取值:true 和 false,不可用 0 / 非 0 替代布尔值。
常用于条件判断(if、while 等语句)。
dart
bool isStudent = true;
if (isStudent) {
print("是学生");
}

七、Dart中列表类型
对应其他语言的数组,是有序的元素集合,分为不可变列表和可变列表。
-
不可变列表:用 const 声明,元素不能增删改。
dartList<int> list1 = const [1, 2, 3]; -
可变列表:用 [] 声明,支持 add()、remove()、insert() 等操作。
dartList<String> list2 = ["Java", "Dart"]; list2.add("Flutter"); // 添加元素 list2.removeAt(0); // 删除指定索引元素 -
支持泛型指定元素类型,也可通过 var 自动推断。

八、Dart中字典类型-Map
是键值对的无序集合,键和值都可以是任意类型,同样分为不可变和可变两种。
1. 不可变 Map
用 const 声明。
dart
void main() {
Map<String, int> scoreMap = const {
"语文": 90,
"数学": 85,
"英语": 95
};
// scoreMap["语文"] = 95; // 运行报错:Unsupported operation: set
}

2. 可变 Map
用 {} 声明,支持 putIfAbsent()、remove() 等操作。
dart
void main() {
// 声明方式1:指定泛型
Map<String, dynamic> userInfo = {
"name": "爱吃大芒果",
"age": 19,
"isStudent": true
};
// 声明方式2:空 Map 初始化
Map<int, String> idMap = {};
// 新增/修改键值对
userInfo["height"] = 175.5; // 新增键值对
userInfo["age"] = 20; // 修改已有键的值
// 安全添加(键不存在时才添加)
userInfo.putIfAbsent("gender", () => "男"); // 键不存在,添加
userInfo.putIfAbsent("age", () => 21); // 键已存在,不修改
// 删除键值对
userInfo.remove("isStudent");
// 查询值
print(userInfo["name"]); // 取值:爱吃大芒果
print(userInfo["phone"]); // 键不存在,返回 null
// 遍历 Map
// 方式1:遍历键
for (String key in userInfo.keys) {
print("键:$key,值:${userInfo[key]}");
}
// 方式2:遍历值
for (dynamic value in userInfo.values) {
print("值:$value");
}
// 方式3:遍历键值对
userInfo.forEach((key, value) {
print("$key:$value");
});
}
3. 访问值
通过 map[key] 的方式,若键不存在则返回 null。
九、Dart中动态类型-dynamic
使用 dynamic 声明的变量,类型不受限制,可在运行时动态改变类型。
慎用:会失去 Dart 的类型检查优势,容易引发运行时错误。
dart
dynamic value = "Hello";
value = 100; // 允许修改类型
value = true;

十、Dart中的空安全机制
Dart 的空安全是语法层面的特性,核心目标是避免空指针异常(NullPointerException),主要包含以下关键点:
-
可空类型:在类型后加
?,表示该变量可以存储 null 值。dartString? name = null; // 允许为 null name = "爱吃大芒果"; // 也可以赋值为字符串 -
非空断言:在变量后加
!,表示强制断言该变量不为 null,若实际为 null 则会抛出运行时错误。dartString? str = "Hello"; String newStr = str!; // 断言 str 不为 null -
空值合并运算符:
??,若左侧变量为 null,则使用右侧的默认值。dartString? name = null; String realName = name ?? "未知姓名"; // realName 最终为 "未知姓名" -
空值赋值运算符:
??=,若变量为 null,则将右侧值赋值给变量;若不为 null,则保持原值。dartString? name = null; name ??= "爱吃大芒果"; // name 被赋值为 "爱吃大芒果"

十一、Dart中算术运算符和赋值运算符
1. 算术运算符
用于数值计算,包含基础运算和自增 / 自减,用法与主流语言一致。

2. 赋值运算符
核心是 =,扩展运算符可简化运算 + 赋值操作。
- 基础:
= - 复合:
+=、-=、*=、/=、~/=、%=
dart
void main() {
int a = 5;
a += 3; // a = 8
a -= 2; // a = 6
a *= 2; // a = 12
a ~/= 5; // a = 2
a %= 2; // a = 0
print(a); // 0
}

3. 比较运算符
用于判断两个值的关系,返回 bool 类型(true/false)。
4. 逻辑运算符
用于布尔值的逻辑运算,常用于条件组合判断。
dart
void main() {
int score = 85;
bool isStudent = true;
// 逻辑与:两个条件都为真才为真
if (score >= 80 && isStudent) {
print("优秀学生");
}
// 逻辑或:任意一个条件为真即为真
if (score < 60 || !isStudent) {
print("不满足优秀条件");
}
}
十二、Dart中if分支和三元运算符
1. if 分支
基础条件判断,支持 if、if-else、if-else if-else 结构。
dart
void main() {
int score = 85;
if (score >= 90) {
print("优秀");
} else if (score >= 80) {
print("良好");
} else if (score >= 60) {
print("及格");
} else {
print("不及格");
}
}
2. 三元运算符
条件 ? 表达式1 : 表达式2,简化二选一的 if-else 逻辑。
dart
void main() {
int score = 85;
// 基础用法
String result = score >= 60 ? "及格" : "不及格";
print(result); // 及格
// 嵌套用法(不推荐多层嵌套,可读性差)
String level = score >= 90 ? "优秀" : (score >= 80 ? "良好" : "普通");
print(level); // 良好
}
十三、Dart中switch_case
用于多分支等值判断,相比多层 if-else 更简洁,Dart 中需注意:
- 每个 case 末尾必须加 break(终止执行),或用 continue 跳转到其他 case。
- 支持 default 分支(匹配不到时执行)。
- 支持匹配 int、String、枚举等类型。
dart
String level = "B";
switch (level) {
case "A":
print("优秀");
break;
case "B":
print("良好");
break;
default:
print("普通");
}
注意事项
- 每个 case 末尾必须加 break(终止执行)或 continue(跳转到其他 case)
- 支持匹配 int、String、枚举等类型
- default 分支可选,建议添加以处理异常情况
十四、Dart中while循环
先判断条件,再执行循环体,支持 while 和 do-while(先执行一次,再判断)
dart
int i = 0;
while (i < 5) {
print(i);
i++;
}
int j = 0;
do {
print(j); // 至少执行一次
j++;
} while (j < 0);
十五、Dart中for循环
适合已知循环次数的场景,Dart 中支持经典 for 循环和 for-in 遍历集合。
dart
// 经典 for 循环
for (int k = 0; k < 5; k++) {
print(k);
}
// for-in 遍历列表/Map
List<String> list = ["a", "b", "c"];
for (String item in list) {
print(item);
}
Map<String, int> map = {"a": 1, "b": 2};
for (String key in map.keys) {
print("$key: ${map[key]}");
}
十六、Dart中的函数定义
Dart 是面向函数的语言,函数是一等对象,基础定义格式:
dart
// 格式:返回值类型 函数名(参数列表) { 函数体; return 返回值; }
int add(int a, int b) {
return a + b;
}
// 无返回值可写 void,也可省略 return
void printInfo(String info) {
print(info);
}
void main() {
int sum = add(3, 5);
print(sum); // 8
printInfo("爱吃大芒果"); // 输出:爱吃大芒果
}
// 有返回值函数
int add(int a, int b) {
return a + b;
}
// 无返回值函数(void)
void printInfo(String info) {
print("信息:$info");
}
十七、Dart中函数的必传参数、可选位置参数和可选命名参数
(1)必传参数
默认参数为必传,调用时必须传入,数量和类型需匹配。
dart
void sayHello(String name) { // name 是必传参数
print("Hello $name");
}
sayHello("Dart"); // 必须传参,否则报错
(2)可选位置参数
用 [] 包裹,调用时可传可不传,需放在必传参数后,可指定默认值。
dart
// [age] 是可选位置参数,默认值 18
void introduce(String name, [int age = 18]) {
print("姓名:$name,年龄:$age");
}
introduce("张三"); // 使用默认值:姓名:张三,年龄:18
introduce("李四", 20); // 传入参数:姓名:李四,年龄:20

(3)可选命名参数
用 {} 包裹,调用时需指定参数名(参数名: 值),可读性更高,也可指定默认值。
dart
// {age, gender} 是可选命名参数
void introduce2(String name, {int age = 18, String gender = "男"}) {
print("姓名:$name,年龄:$age,性别:$gender");
}
// 调用:指定参数名,顺序可任意
introduce2("王五", gender: "女", age: 22);
十八、Dart中的匿名函数和箭头函数
1. 匿名函数
无函数名的函数,常用于临时回调
dart
Function test = () {
print("测试");
};
void onTest(Function callBack) {
callBack();
}
void main(List<String> args) {
onTest(test); // 调用函数,传递匿名函数
}
// 输出:测试
2. 箭头函数
用 => 简化单行函数体的匿名函数,=> 后只能跟一个表达式
dart
int multiply(int a, int b) => a * b;
Dart 作为 Flutter 的核心开发语言,其语法兼具安全性和灵活性。本次学习内容围绕Dart语法入门为主题展开,重点梳理了关键概念、实用方法和操作步骤。掌握这些基础语法是深入学习 Flutter 开发的重要前提。
欢迎加入开源鸿蒙跨平台社区:开源鸿蒙跨平台开发者社区