Flutter基础(Future和async/await)

发布于:2025-06-30 ⋅ 阅读:(14) ⋅ 点赞:(0)

 什么是 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秒)


网站公告

今日签到

点亮在社区的每一天
去签到