作为Flutter框架的唯一开发语言,Dart凭借其简洁的语法、高效的性能以及对跨平台开发的良好适配,成为移动开发领域的热门语言。对于想要入门Flutter的开发者而言,掌握Dart语言是搭建开发能力的核心前提。本文将从Dart语言的基础语法入手,逐步深入核心特性,结合Flutter开发场景提供实战案例,帮助开发者快速掌握Dart语言的关键知识点,为Flutter开发打下坚实基础。
核心概念与基础语法
- Dart语言特点:JIT/AOT编译、跨平台、面向对象
- 变量与数据类型:
var/final/const区别、基础类型(int,double,String,bool) - 函数与闭包:命名参数/可选参数、
=>箭头函数、词法作用域 - 运算符与流程控制:
??空安全操作符、for-in循环
面向对象编程
- 类与对象:构造函数语法(命名构造、工厂构造)、
this关键字 - 继承与混入:
extends与implements对比、mixin的使用场景 - 抽象类与接口:
abstract定义、implicit interfaces特性 - 泛型编程:集合泛型(
List<T>)、泛型方法约束
异步编程与事件循环
Future与async/await:错误处理(try-catch)、链式调用Stream应用:单订阅与广播流、StreamController管理- Isolate机制:多线程通信(
SendPort/ReceivePort)
核心库与常用工具
- 集合操作:
List.map()、Set去重、Map遍历 - 字符串处理:正则表达式、模板字符串(
$variable) - 日期与时间:
DateTime计算、时区转换 - 文件与网络:
dart:io读写文件、http库请求封装
Flutter实战结合
- Widget与Dart关联:
StatefulWidget生命周期方法 - 状态管理方案:
setState、Provider、Riverpod的Dart实现 - 平台交互:
MethodChannel与Dart侧逻辑封装 - 性能优化:
const构造减少Widget重建、compute()隔离耗时任务
高级特性与工程化
- 空安全(Null Safety):
?/!运算符使用规范 - 扩展方法(Extension Methods):为原生类型添加功能
- 代码生成:
json_serializable与build_runner工作流 - 单元测试:
test库编写用例、Mock依赖(mockito)
实战案例模块
- 案例1:Dart实现购物车状态管理(基于
ChangeNotifier) - 案例2:异步加载列表(
FutureBuilder+ListView) - 案例3:自定义Mixin实现页面权限校验
- 案例4:Isolate解析大型JSON文件

一、Dart语言基础认知
1.1 语言特点与优势
Dart是由Google开发的面向对象、跨平台的编程语言,其设计初衷就是为了解决前端和移动开发中的性能与开发效率问题,核心优势如下:
-
强类型语言:支持静态类型检查,可在编译期发现错误,提升代码稳定性;同时支持类型推断,无需显式声明所有变量类型,兼顾开发效率。
-
垃圾自动回收:采用分代垃圾回收机制,高效释放内存,减少内存泄漏风险,适配移动设备的资源约束场景。
-
单线程模型+事件循环:通过事件循环处理异步操作,避免多线程并发问题,同时支持Isolate实现并发执行,平衡开发简单性与性能。
-
完美适配Flutter:与Flutter深度集成,支持热重载(Hot Reload),修改代码后可快速预览效果,大幅提升开发效率。
1.2 开发环境搭建
Dart环境搭建简单,推荐两种主流方式,可根据需求选择:
| 搭建方式 | 操作步骤 | 适用场景 |
|---|---|---|
| 独立Dart SDK安装 | 1. 访问Dart官方网站(https://dart.dev/get-dart);2. 根据系统选择对应版本(Windows/macOS/Linux);3. 安装完成后,终端执行dart --version验证是否安装成功。 |
单独学习Dart语法,不依赖Flutter环境 |
| Flutter SDK集成(推荐) | 1. 安装Flutter SDK(Flutter内置Dart SDK,无需单独安装);2. 配置Flutter环境变量;3. 终端执行dart --version验证。 |
准备学习Flutter开发,兼顾Dart语法练习 |
编辑器推荐:Visual Studio Code(安装Dart插件)、Android Studio/DevEco Studio(安装Dart插件),均支持语法高亮、代码提示、运行调试等功能。
二、Dart核心基础语法
2.1 变量与常量
Dart中变量声明使用var、dynamic、Object或具体类型(如int、String),常量声明使用final或const。
void main() {
// 变量声明
var name = "Dart"; // 类型推断为String
var age = 20; // 类型推断为int
dynamic gender = "Male"; // 动态类型,可随时修改类型
String address = "Google"; // 显式声明类型
// 常量声明(不可修改)
final height = 180.5; // 运行时常量,初始化后不可修改
const weight = 75.0; // 编译时常量,必须在编译期确定值
print("姓名:$name,年龄:$age"); // 字符串插值
print("身高:$height,体重:$weight");
}
关键说明:
-
var:根据赋值自动推断类型,一旦赋值后类型固定,不可修改。 -
dynamic:动态类型,可随时修改变量类型,编译期不进行类型检查,可能导致运行时错误,谨慎使用。 -
finalvsconst:final是运行时常量,赋值可以是表达式(如函数返回值);const是编译时常量,赋值必须是编译期可确定的常量值。
2.2 数据类型
Dart支持多种基础数据类型,核心常用类型如下:
| 数据类型 | 说明 | 示例 |
|---|---|---|
| 数值类型(num) | 包含int(整数)和double(浮点数),支持基本数学运算 | int a = 10; double b = 3.14; |
| 字符串(String) | UTF-16编码的字符序列,支持单引号、双引号、三引号(多行字符串) | String s1 = 'Hello'; String s2 = """Hello Dart"""; |
| 布尔值(bool) | 只有true和false两个值,用于条件判断 | bool isTrue = true; bool isFalse = false; |
| 列表(List) | 有序集合,支持泛型,可动态增删元素(类似Java的ArrayList) | List<int> list = [1,2,3]; list.add(4); |
| 映射(Map) | 键值对集合,键和值可指定类型,键唯一 | Map<String, int> map = {"a":1, "b":2}; |
| 空值(Null) | Dart 2.12+支持空安全,变量默认不可为空,需显式声明可空类型(加?) | String? str = null; // 可空字符串 |
2.3 运算符与流程控制
Dart的运算符与流程控制语句与Java、JavaScript等语言类似,核心重点如下:
2.3.1 核心运算符
void main() {
// 算术运算符
int a = 10, b = 3;
print(a + b); // 13
print(a ~/ b); // 3(整数除法)
print(a % b); // 1(取余)
// 空安全运算符
String? name = null;
print(name ?? "未知"); // 未知(空值替代)
print(name?.length); // null(安全访问,避免空指针)
// 赋值运算符
int c = a;
c += b; // 等价于c = c + b
print(c); // 13
}
2.3.2 流程控制语句
void main() {
// 1. if-else
int score = 85;
if (score >= 90) {
print("优秀");
} else if (score >= 80) {
print("良好");
} else {
print("加油");
}
// 2. for循环
List<String> fruits = ["苹果", "香蕉", "橙子"];
for (var fruit in fruits) {
print(fruit);
}
// 3. while循环
int i = 0;
while (i < 3) {
print(i);
i++;
}
// 4. switch-case
String grade = "B";
switch (grade) {
case "A":
print("优秀");
break;
case "B":
print("良好");
break;
default:
print("其他");
}
}
三、Dart核心特性(Flutter开发重点)
3.1 函数与箭头函数
Dart中函数是一等公民,可作为参数传递、返回值返回,核心语法如下:
void main() {
// 1. 普通函数
int add(int a, int b) {
return a + b;
}
print(add(2, 3)); // 5
// 2. 箭头函数(单表达式函数简写)
int subtract(int a, int b) => a - b;
print(subtract(5, 2)); // 3
// 3. 匿名函数(无名称函数,常用于回调)
List<int> list = [1,2,3,4];
list.forEach((item) => print(item)); // 遍历列表
// 4. 可选参数(位置可选参数、命名可选参数)
// 位置可选参数:用[]包裹
String buildName(String firstName, [String? lastName]) {
return lastName != null ? "$firstName $lastName" : firstName;
}
print(buildName("张")); // 张
print(buildName("张", "三")); // 张三
// 命名可选参数:用{}包裹,调用时需指定参数名
String buildInfo(String name, {int? age, String? address}) {
String info = "姓名:$name";
if (age != null) info += ", 年龄:$age";
if (address != null) info += ", 地址:$address";
return info;
}
print(buildInfo("李四", age: 25, address: "北京")); // 姓名:李四, 年龄:25, 地址:北京
}
关键说明:Flutter开发中,匿名函数和箭头函数广泛用于组件回调(如按钮点击事件、列表遍历等),需重点掌握。
3.2 面向对象编程(类与对象)
Dart是纯面向对象语言,所有事物都是对象,核心概念包括类、对象、继承、封装、多态等:
// 1. 类的定义
class Person {
// 成员变量(属性)
String name;
int age;
// 构造函数(简化写法,可省略参数赋值步骤)
Person(this.name, this.age);
// 成员方法
void introduce() {
print("我叫$name,今年$age岁");
}
// 静态方法(属于类,不属于对象,通过类名调用)
static void sayHello() {
print("Hello Dart!");
}
}
// 2. 继承(extends关键字,单继承)
class Student extends Person {
String school;
// 子类构造函数:需先调用父类构造函数
Student(String name, int age, this.school) : super(name, age);
// 重写父类方法
@override
void introduce() {
print("我叫$name,今年$age岁,就读于$school");
}
}
void main() {
// 创建对象
Person person = Person("王五", 30);
person.introduce(); // 我叫王五,今年30岁
Student student = Student("赵六", 18, "北京大学");
student.introduce(); // 我叫赵六,今年18岁,就读于北京大学
// 调用静态方法
Person.sayHello(); // Hello Dart!
}
3.3 异步编程(Future与async/await)
Flutter开发中大量涉及异步操作(如网络请求、文件读写、延迟任务等),Dart通过Future和async/await实现优雅的异步编程:
void main() async {
// 1. Future基础使用(表示一个异步操作的结果)
Future<String> fetchData() {
// 模拟网络请求,延迟2秒返回数据
return Future.delayed(Duration(seconds: 2), () {
return "获取到的数据";
});
}
// 方式1:通过then()处理异步成功结果,catchError()处理异常
fetchData()
.then((data) => print("方式1:$data"))
.catchError((error) => print("错误:$error"));
// 方式2:通过async/await简化异步代码(类似同步代码写法)
String data = await fetchData();
print("方式2:$data");
// 2. 并行异步操作(Future.wait)
Future<int> task1() => Future.delayed(Duration(seconds: 1), () => 1);
Future<int> task2() => Future.delayed(Duration(seconds: 2), () => 2);
List<int> results = await Future.wait([task1(), task2()]);
print("并行任务结果:$results"); // [1,2](等待所有任务完成)
}
关键说明:async关键字用于标记函数为异步函数,函数返回值自动转为Future;await关键字用于等待Future完成,只能在async函数中使用。
3.4 空安全(Null Safety)
Dart 2.12+引入空安全特性,核心目的是避免空指针异常,是Flutter开发的必备知识点:
void main() {
// 1. 不可空类型(默认):变量不能为null
String name = "Dart";
// name = null; // 编译错误
// 2. 可空类型:变量后加?,可赋值为null
String? nullableName = "Flutter";
nullableName = null; // 合法
// 3. 非空断言:确定变量不为null时,用!强制转换为非空类型
String? tempName = "Hello";
String newName = tempName!; // 若tempName为null,运行时会报错
// 4. 空值赋值运算符:??=(变量为null时才赋值)
String? str = null;
str ??= "默认值";
print(str); // 默认值
// 5. 空值安全访问:?.(变量为null时返回null,不报错)
String? address = null;
print(address?.length); // null
}
四、Dart实战:Flutter组件中的Dart应用
结合Flutter基础组件,演示Dart语法在实际开发中的应用,实现一个简单的列表展示组件:
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
// 1. 定义数据模型(面向对象)
class Fruit {
final String name;
final String color;
Fruit(this.name, this.color);
}
// 2. 根组件(StatelessWidget)
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Dart+Flutter实战',
theme: ThemeData(primarySwatch: Colors.blue),
home: const FruitListPage(),
);
}
}
// 3. 列表页面(StatefulWidget)
class FruitListPage extends StatefulWidget {
const FruitListPage({super.key});
@override
State<FruitListPage> createState() => _FruitListPageState();
}
class _FruitListPageState extends State<FruitListPage> {
// 列表数据(List集合)
final List<Fruit> _fruitList = [
Fruit("苹果", "红色"),
Fruit("香蕉", "黄色"),
Fruit("橙子", "橙色"),
Fruit("葡萄", "紫色"),
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('水果列表')),
body: ListView.builder(
// 列表长度
itemCount: _fruitList.length,
// 列表项构建(匿名函数+箭头函数)
itemBuilder: (context, index) {
final fruit = _fruitList[index];
return ListTile(
title: Text(fruit.name),
subtitle: Text("颜色:${fruit.color}"),
// 点击事件(匿名函数)
onTap: () {
// 弹窗提示(Flutter组件回调)
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text("你选择了${fruit.name}"),
content: Text("这是一个${fruit.color}的${fruit.name}"),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: const Text("确定"),
),
],
),
);
},
);
},
),
);
}
}
代码说明:该案例融合了Dart的类与对象、List集合、匿名函数、箭头函数等知识点,同时结合Flutter的ListView、ListTile、AlertDialog等组件,展示了Dart在Flutter开发中的实际应用场景。
五、Dart学习资源与进阶方向
5.1 推荐学习资源
-
官方文档:Dart官方指南(权威、全面,包含语法、特性、最佳实践)
-
实战练习:Dart Pad(https://dartpad.dev/),在线编写Dart代码,无需搭建本地环境
-
Flutter结合:Flutter官方文档中的Dart部分(https://flutter.dev/docs/get-started/learn-dart),针对性更强
5.2 进阶方向
-
高级特性:深入学习Dart的泛型、Mixins(混入)、扩展方法(Extension Methods)、Isolate并发等高级特性。
-
状态管理:学习Dart在Flutter状态管理中的应用(如Provider、Bloc、GetX等,核心依赖Dart的函数、类、异步等知识点)。
-
性能优化:掌握Dart的内存管理、垃圾回收机制,结合Flutter进行性能优化(如减少重建、合理使用缓存等)。
六、总结
Dart语言作为Flutter开发的基础,其语法简洁、特性强大,且与Flutter深度融合,掌握Dart是入门Flutter的关键。本文从基础语法、核心特性到实战案例,覆盖了Dart语言的核心知识点,重点突出了Flutter开发中常用的函数、异步编程、面向对象、空安全等内容。
学习Dart的关键在于多写多练,建议先通过简单案例熟悉基础语法,再结合Flutter组件进行实战练习,逐步掌握Dart与Flutter的协同开发技巧。随着学习的深入,可进一步探索Dart的高级特性,为开发复杂Flutter应用打下坚实基础。
欢迎大家加入[开源鸿蒙跨平台开发者社区](https://openharmonycrossplatform.csdn.net),一起共建开源鸿蒙跨平台生态。