Flutter基础(Future和async/await)
什么是 Future
?
Future
就像一个 “承诺”:我现在不能给你结果,但未来某个时间点一定给你(成功或失败)。
最简单的例子
// 模拟异步操作:2秒后返回"Hello, Future!"
Future<String> fetchData() {return Future.delayed(Duration(seconds: 2), () => "Hello, Future!");
}void main() {print("开始执行...");// 方式一:使用 .then() 处理结果fetchData().then((result) {print("接收到结果: $result"); // 2秒后打印});print("主线程继续执行,不会等待"); // 立即打印
}// 输出顺序:
// 1. 开始执行...
// 2. 主线程继续执行,不会等待
// 3. (2秒后) 接收到结果: Hello, Future!
用 async/await
简化代码
Future<String> fetchData() {return Future.delayed(Duration(seconds: 2), () => "Hello, Async/Await!");
}void main() async {print("开始执行...");// 方式二:使用 async/await (更简洁)String result = await fetchData(); // 等待Future完成print("接收到结果: $result");print("主线程继续执行"); // 2秒后才会执行这行
}
特性 | 不用 async/await (.then() ) | 用 async/await |
---|---|---|
代码结构 | 嵌套回调(Callback Hell) | 线性结构,类似同步代码 |
错误处理 | 需要 .catchError() 链 | 可以用 try/catch 块 |
执行顺序 | 回调函数在 Future 完成后才会被加入事件队列 | 代码逻辑上是 “等待”,但实际不会阻塞主线程 |
连续异步操作对比
不用 async/await
(嵌套回调)
void main() {fetchUserData().then((user) {return fetchUserPosts(user.id); // 返回第二个 Future}).then((posts) {return savePostsToCache(posts); // 返回第三个 Future}).then((_) {print("全部完成");}).catchError((error) {print("错误: $error");});
}
用 async/await
(线性结构)
void main() async {try {User user = await fetchUserData();List<Post> posts = await fetchUserPosts(user.id);await savePostsToCache(posts);print("全部完成");} catch (error) {print("错误: $error");}
}
Future的并行和串行
核心区别:启动时机不同
串行执行(代码 1):
// 第一步:启动任务1 → 等待2秒 → 任务1完成
final result1 = await fetchData1(); // 2秒后才会继续执行下一行// 第二步:启动任务2 → 等待2秒 → 任务2完成
final result2 = await fetchData2(); // 再等2秒
并行执行(代码 2):
// 第一步:同时启动任务1和任务2
final future1 = fetchData1(); // 立即启动任务1
final future2 = fetchData2(); // 立即启动任务2// 第二步:分别等待两个任务完成
// 由于两个任务同时进行,这里只需要等2秒
final result1 = await future1; // 2秒后完成
final result2 = await future2; // 立即完成(因为已经等了2秒)