第一章 开发环境与工具链
1.1 Dart SDK安装与验证
安装Dart SDK是开发的第一步,需注意以下要点:
- 访问官网选择对应操作系统的安装包
- 配置环境变量(Windows需手动添加,Mac/Linux通过brew或apt安装)
- 终端验证安装:
dart --version
,成功显示版本号如Dart 2.19.6
即安装成功
常见问题:
• 环境变量未生效:重启终端或使用source ~/.bash_profile
刷新配置
• 版本冲突:使用dvm
(Dart版本管理器)管理多版本
1.2 IDE配置与插件
推荐使用Visual Studio Code:
- 安装Dart插件(提供代码提示、调试支持)
- 安装Flutter插件(集成开发环境)
- 配置
settings.json
优化开发体验:
{
"dart.lineLength": 120,
"dart.previewFlutterUiGuides": true
}
第二章 基础语法实战演练
2.1 变量与常量
• 动态类型推断:var name = 'Dart'
(自动识别为String)
• 空安全机制:变量默认不可空,需显式声明可空性:
int? nullableAge = null; // 可空类型
String nonNullableName = '小明'; // 非空类型
• 常量声明:
const PI = 3.14; // 编译时常量
final currentTime = DateTime.now(); // 运行时常量
2.2 流程控制
条件分支:
String checkRain(bool isRaining) {
return isRaining ? '带伞' : '无需带伞'; // 三元表达式
}
循环控制:
// for-in遍历集合
var fruits = ['苹果', '香蕉'];
for (var fruit in fruits) {
print('水果:$fruit');
}
// while处理动态条件
int count = 0;
while (count < 5) {
print('计数:${count++}');
}
2.3 集合操作
• 列表高级操作:
var numbers = [1, 2, 3];
numbers
.map((n) => n * 2) // 转换为[2,4,6]
.where((n) => n > 3) // 过滤出[4,6]
.forEach(print);
• Map的键值处理:
var capitals = {'中国': '北京', '日本': '东京'};
capitals.update('美国', (v) => '华盛顿', ifAbsent: () => '华盛顿');
第三章 函数与类实战
3.1 函数式编程
• 命名参数与可选参数:
void printUser({required String name, int age = 18}) {
print('$name ($age岁)');
}
// 调用:printUser(name: '李雷', age: 20);
• 匿名函数应用:
var add = (int a, int b) => a + b;
list.sort((a, b) => a.compareTo(b));
3.2 面向对象开发
类与继承:
class Animal {
String name;
Animal(this.name); // 构造方法
void run() => print('$name在奔跑');
}
class Cat extends Animal {
Cat(String name) : super(name); // 调用父类构造
@override
void run() {
super.run();
print('并且会爬树');
}
}
工厂构造函数:
class Logger {
static final Logger _instance = Logger._internal();
factory Logger() => _instance; // 单例模式
Logger._internal();
}
第四章 异步编程实战
4.1 Future与async/await
• 网络请求模拟:
Future<String> fetchUserData() async {
await Future.delayed(Duration(seconds: 2)); // 模拟延迟
return '{"name": "王芳", "age": 25}';
}
void main() async {
try {
var data = await fetchUserData();
print('获取数据:$data');
} catch (e) {
print('请求失败:$e');
}
}
4.2 Stream应用
• 实时数据流处理:
Stream<int> timedCounter(Duration interval, int maxCount) async* {
int count = 0;
while (count < maxCount) {
await Future.delayed(interval);
yield count++;
}
}
void main() {
timedCounter(Duration(seconds: 1), 5)
.listen((count) => print('计数:$count'));
}
第五章 项目实战:待办事项应用
5.1 功能需求
• 添加/删除任务
• 标记完成状态
• 数据持久化存储
• 分类过滤功能
5.2 核心实现
数据模型:
class TodoItem {
final String id;
String title;
bool isCompleted;
DateTime createTime;
TodoItem({
required this.title,
this.isCompleted = false,
}) : id = uuid.v4(),
createTime = DateTime.now();
}
状态管理:
class TodoList {
final List<TodoItem> _items = [];
void addItem(String title) {
_items.add(TodoItem(title: title));
}
void toggleComplete(String id) {
var item = _items.firstWhere((i) => i.id == id);
item.isCompleted = !item.isCompleted;
}
}
文件存储:
Future<void> saveData(List<TodoItem> items) async {
final file = File('todo.json');
await file.writeAsString(jsonEncode(items));
}
第六章 高频问题解析
6.1 类型转换错误
// 错误示例
var input = '123a';
int value = int.parse(input); // 抛出FormatException
// 正确处理
int? safeParse(String input) {
return int.tryParse(input) ?? 0;
}
6.2 异步嵌套陷阱
// 反模式:回调地狱
fetchUser().then((user) {
fetchOrders(user.id).then((orders) {
// 多层嵌套...
});
});
// 优化方案:async/await
void loadData() async {
var user = await fetchUser();
var orders = await fetchOrders(user.id);
// 线性代码结构
}
6.3 空安全异常
// 错误:可能触发空指针
String? name;
print(name.length);
// 正确处理
if (name != null) {
print(name.length);
}
// 或使用空安全运算符
print(name?.length ?? 0);
6.4 平台兼容性问题
• 文件路径差异:
// 跨平台路径处理
var path = Platform.isAndroid
? '/storage/emulated/0/data'
: '${Directory.current.path}/data';
• 网络请求库选择:Web端使用dart:html
的HttpRequest,移动端使用dart:io
的HttpClient