当前位置: 首页 > news >正文

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秒)

http://www.lryc.cn/news/576345.html

相关文章:

  • Gemini CLI 项目架构分析
  • 港澳地区,海外服务器ping通可能是地区运营商问题
  • ifconfig返回解析
  • Redis ①④-哨兵
  • Ubuntu20.04离线安装Realtek b852无线网卡驱动
  • HTML表格中<tfoot>标签用法详解
  • OD 算法题 B卷【计算误码率】
  • python解释器 与 pip脚本常遇到的问题汇总
  • 2025年健康医疗大数据开放共享:现状、挑战与未来发展
  • 掌握 MySQL 的基石:全面解读数据类型及其影响
  • ReasonGraph 大模型推理过程可视化开源工具使用探索,大模型幻觉可视化研究
  • zookeeper Curator(1):认识zookeeper和操作命令
  • [论文阅读] 软件工程 | 微前端在电商领域的实践:一项案例研究的深度解析
  • React 第六十六节Router中 StaticRouter使用详解及注意事项
  • 前端React和Vue框架的区别
  • 深入理解C#委托操作:添加、移除与调用全解析
  • 网络 : 传输层【UDP协议】
  • Linux-读者写者问题
  • STM32F103C8T6参数说明
  • Android4的InputReader
  • 一款支持多日志器、多级别、多落地方式的同异步日志系统
  • 搭建Flink分布式集群
  • 零知开源——基于STM32F407VET6零知增强板的四路独立计时器
  • 配置阿里云OSS实现https访问
  • 解决flash-attn安装报错的问题
  • Java-对象的字符串表示
  • Day45 Tensorboard使用介绍
  • 计算机操作系统(十七)内存管理
  • 关于上位机的热更新
  • 暑假复习篇之运算与逻辑