Flutter-----异步编程:Future和Stream

ops/2024/10/21 23:26:37/

异步编程:使用 Future 和 async-await | Dart

什么是异步操作/异步操作的作用?

Dart 代码运行在单个执行“线程”中。如果 Dart 代码在执行时阻塞,例如:处理一个需要长时间运行的计算操作或等待 I/O 完成。此时整个程序会被“冻结”。

异步操作可以让你的程序在等待一个操作完成时继续处理其它的工作。Dart 使用 Future 对象来表示异步操作的结果。异步计算不会阻塞所有计算直到结果可用,而是立即返回一个 Future ,最终将“完成”结果

future是什么?

future 是 Future<T> 类的对象,其表示一个 T 类型的异步操作结果。如果异步操作不需要结果,则 future 的类型可为 Future<void>。当一个返回 future 对象的函数被调用时,会发生两件事:

  1. 将函数操作列入队列等待执行并返回一个未完成的 Future 对象。

  2. 不久后当函数操作执行完成,Future 对象变为完成并携带一个值或一个错误。

如何使用future?

使用关键字 async 和 await

 async 和 await的作用?

它们允许你不使用 Future 的 API (Future.then和Future.catchError)编写看起来与同步代码一样的异步代码。

  • 在异步函数中使用 await 关键字暂停代码的执行,直到对应的 future 完成。

  • 可以使用 try-catch 表达式来捕获异步函数中代码的执行错误。

case1:

/// 新建的Future学习类
class FutureStudy{// 延时1秒钟Future<void> futureDelay() async {await Future.delayed(new Duration(seconds: 1),() =>print("1秒后打印-延时任务"));}
}
main() async {// 调用 FutureStudy 中的延时方法 -延时在前 正常在后FutureStudy().futureDelay();print("正常打印");
}

打印结果:延时语句在前但是却后打印,这是因为:

await Future.delayed(new Duration(seconds: 1),() =>print("1秒后打印-延时任务")); 会阻塞一秒钟

而异步操作可以让你的程序在等待一个操作完成时继续处理其它的工作

I/flutter ( 3898): 正常打印
I/flutter ( 3898): 1秒后打印-延时任务 

case2:

main() async {// 调用 FutureStudy 中的延时方法 -延时在前 正常在后await FutureStudy().futureDelay();print("正常打印");
}

I/flutter ( 3898): 1秒后打印-延时任务
I/flutter ( 3898): 正常打印

此时先打印延时方法里的是因为:

main中 await FutureStudy().futureDelay()需要先等待futureDelay()内部方法完成后再执行后面的语句,所以体现的是一个同时操作的效果。

case3:

在此基础上修改 FutureStudy 中的代码

class FutureStudy{futureDelay() async {// 模拟延时效果 - 等待两秒后再执行Future.delayed(const Duration(seconds: 1),() =>print("1秒后打印-延时任务"));}
}

I/flutter ( 3898): 正常打印
I/flutter ( 3898): 1秒后打印-延时任务

此时的打印结果和case1相同,这是因为main中 await FutureStudy().futureDelay() 要等待函数执行完成后再执行其他语句,但是函数内部遵循的是异步操作,此时它可以执行其他语句。

使用 Future API

由于Future可以通过两种方式完成,要么使用值(如果异步计算成功),要么使用错误(如果计算失败),因此可以为其中一种或两种情况安装回调。

Future的所有API的返回值仍然是一个Future对象,Future.then可以使用这个future。

Future<R> then<R>(FutureOr<R> onValue(T value), {Function? onError});

then()会在 Future函数体执行完毕后立刻执行

如果,future是作为值返回的,则调用回调函数 onValue 回调函数,里面的参数是value去future返回的值,如果future的结果是错误则调用 onError 回调函数

then中的回调onError和Future.catchError

Future.catchError回调只处理原始Future抛出的错误,不能处理回调函数抛出的错误,onError只能处理当前Future的错误

Future.whenComplete

Future.whenComplete 在Future完成之后总是会调用,不管是错误导致的完成还是正常执行完毕

 Future.wait

等待多个Future完成,并收集它们的结果。有两种情况

  • 所有Future都有正常结果返回。则Future的返回结果是所有指定Future的结果的集合
  • 其中一个或者几个Future发生错误,产生了error。则Future的返回结果是第一个发生错误的Future的值

Future.foreach

根据某个集合对象,创建一系列的Future。并且会按顺序执行这些Future

void testFuture() async {Future.forEach({1,2,3}, (num){return Future.delayed(Duration(seconds: num),(){print("第$num秒执行");});});
}
testFuture();
print("在testFuture()执行之后打印。");

 处理Stream流

异步编程:使用 stream | Dart


http://www.ppmy.cn/ops/5556.html

相关文章

Golang插件系统实现

插件可以在解耦的基础上灵活扩展应用功能&#xff0c;本文介绍了如何基于Golang标准库实现插件功能&#xff0c;帮助我们构建更灵活可扩展的应用。原文: Plugins with Go 什么是插件 简单来说&#xff0c;插件就是可以被其他软件加载的软件&#xff0c;通常用于扩展应用程序的功…

一文学会 ts 构建工具 —— tsup

文章目录 能打包什么&#xff1f;安装用法自定义配置文件条件配置在 package.json 中配置多入口打包生成类型声明文件sourcemap生成格式自定义输出文件代码分割产物目标环境支持 es5编译的环境变量对开发命令行工具友好监听模式 watch提供成功构建的钩子 onSuccess压缩产物 min…

linux离线安装mysql

一、下载mysql 地址&#xff1a;MySQL 这里选择64为还是32为要根据操作系统来 uname -m 二、上传解压配置mysql 使用root账户登录linux服务器&#xff0c;在opt文件下创建mysql文件夹 cd /opt sudo mkdir mysql 使用Xftp上传mysql压缩包到此文件夹下(自行决定路径) cd mysql/…

.NET 设计模式—备忘录模式(Memento Pattern)

简介 备忘录模式&#xff0c;又称之为快照模式(Snapshop Pattern)&#xff0c;是一种行为型设计模式&#xff0c;&#xff0c;它允许在不破坏对象封装性的前提下&#xff0c;捕获并保存一个对象的内部状态&#xff0c;以便在需要时恢复该对象到原先的状态。备忘录模式可以为我们…

【K8S系列】深入解析K8S中PV 和PVC

在 Kubernetes 中&#xff0c;PV&#xff08;持久卷&#xff09;和 PVC&#xff08;持久卷声明&#xff09;之间的关系是一种动态匹配和绑定关系&#xff0c;用于实现 Pod 与存储资源的解耦。 一、概念介绍 1.1 PV&#xff08;持久卷&#xff09;&#xff1a; PV 是集群中的一…

【数据结构】插值排序

插值排序&#xff08;Interpolation Search&#xff09;是一种用于在有序数组中查找特定元素的搜索算法。它是二分查找算法的改进版本&#xff0c;通过使用当前查找值与数组中值的比例来估计下一次查找的位置&#xff0c;而不是简单地取中点。 算法步骤 在开始搜索之前&#…

YOLOv9改进策略 | 添加注意力篇 | 挤压和激励单元SENetV2助力YOLOv9细节涨点(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是SENetV2&#xff0c;其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型&#xff0c;而是一个可以和现有的任何一个模型相结合的模块(可以看作是一种通道型的注意力机制但是相对于SENetV1来说…

ROS分布式通讯配置

4WD 必读&#xff1a;分布式通讯是相对于用虚拟机来连接小车上主机来说&#xff0c;如果是 4WD 笔记本无主 机用户&#xff0c;不存在分布式通讯一说。 1.4WD 用户单笔记设置一&#xff0c;连接底盘和雷达还有摄像头。 因为虚拟机带宽问题&#xff0c;无法保证摄像头正常运行。…