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

devtools/2024/9/20 13:36:14/ 标签: android, flutter

异步编程:使用 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/devtools/5768.html

相关文章

‘language‘不能作为表名或字段名

今天写一个C#访问Access的程序&#xff0c;拼接SQL语句时一直出错&#xff0c; string sql "insert into dllinfos (dllname,dllfilename,type,functions,harm,repairmethod,issys, paths, ishorse, language, version, company) values (" textBox1.Text ",…

内联函数面试总结

面试时内联函数被问到的几率不大&#xff0c;但是还是要了解一下&#xff0c;以防万一 宏函数缺点&#xff1a; 1.宏函数没有类型检查 2.函数有二义性 内联函数&#xff1a; 定义&#xff1a; 以inline修饰的函数叫内联函数&#xff0c;编译时C编译器会在调用内联函数的地…

C++三大特性之一:继承

文章目录 前言一、继承方式二、继承类型继承中构造和析构的顺序继承中的内存分配多继承语法(非重点)继承中同名静态成员的处理继承一般在哪里用到进阶&#xff1a;菱形继承和虚拟继承 总结 前言 C三大特性&#xff1a;继承、多态和封装。继承是面向对象编程的一个核心概念&…

linux命令ar使用说明

ar 建立或修改备存文件&#xff0c;或是从备存文件中抽取文件 补充说明 ar命令 是一个建立或修改备存文件&#xff0c;或是从备存文件中抽取文件的工具&#xff0c;ar可让您集合许多文件&#xff0c;成为单一的备存文件。在备存文件中&#xff0c;所有成员文件皆保有原来的属…

python爬虫-----深入了解 requests 库下篇(第二十五天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

【MATLAB源码-第194期】基于matlab的MB-OFDM仿真,超宽带(UWB)无线传输。对比LS/DFT及其改进算法。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 一、无线通信的基本原理 无线通信是通过空气或其他介质传播电磁波来传输信息的技术。这种通信方式的核心在于电磁波&#xff0c;它能够在没有物理连接的情况下传输数据。无线通信的基本流程包括&#xff1a; 信号的生成&am…

OpenHarmony网络协议通信—kcp

kcp 是一种 ARQ 协议,可解决在网络拥堵情况下 tcp 协议的网络速度慢的问题 下载安装 直接在 OpenHarmony-SIG 仓中搜索 kcp 并下载。 使用说明 准备一套完整的 OpenHarmony 3.1 Beta 代码 库代码存放路径&#xff1a;./third_party/kcp 修改添加依赖的编译脚本 在/develo…

uniapp 当前系统没有安装苹果根证书,是否打开证书目录(打开后依次安装证书

当你遇到这类问题时&#xff0c;说明你也极其的困惑&#xff01;这就是为啥大抵国内这些货色搞的东西总是不尽人意&#xff01;连开发者生态都搞不好&#xff0c;就急着吹嘘。 这是官方给的技术说明方案&#xff1a; 恭喜你&#xff0c;当你按照这个搞之后&#xff0c;你的问题…

面试八股——集合——List

主要问题 数组 如果数组索引从0开始时&#xff0c;数组的寻址方式为&#xff1a; 如果数组索引从1开始时&#xff0c;数组的寻址方式为&#xff1a; 此时对于CPU来说增加了一个减法指令&#xff0c;降低寻址效率。 ArrayList⭐ ArrayList构造函数 尤其说一下第三个构造函数流…

datalist 是什么?以及作用是什么?

datalist 是 HTML5 中引入的一个新元素&#xff0c;它用于为 <input> 元素提供预定义的选项列表。当用户开始输入时&#xff0c;浏览器会显示一个下拉列表&#xff0c;其中包含与输入值匹配的 datalist 中的选项。这使得用户可以更容易地从预定义的选项中选择&#xff0c…

centos修改启动项加载不同内核

一.背景&#xff1a; 虚拟机中有时需要编译好几个内核版本&#xff0c;make install后系统存在几个内核版本。需要再哪个内核上开发调试就启动特定的内核版本。这就需要修改启动时的内核版本&#xff0c;再物理机或虚拟机启动时可以上下键选择。但有时是docket云环境中或远程时…

【SpringBoot实战篇】获取用户详细信息

1 明确需求 1需要获取用户详细信息 2 接口文档 1基本信息 2请求参数 无 3 响应数据 响应数据类型&#xff1a;application/json 响应参数说明&#xff1a; 响应数据样例 3 思路分析 1用户名在请求头里获取 4 开发 4.1 控制器usercontroller GetMapping("/userInfo")p…

vue3使用阿里oss上传资源(上传图片、视频、文件、pdf等等),删除oss资源。获取STS token的接口

vue3使用阿里oss上传资源 全部oss.ts代码如下&#xff1a; import OSS from "ali-oss";// 获取STS token export const getSTSToken async () > {const STS_TOKEN_URL "....."; // 获取STS token的接口&#xff0c;后端提供// fetch方式可按需更换成…

UE 录屏自动化上传阿里云OSS

前言 最近在做一个功能&#xff0c;然后就发现了一个很有趣的东西&#xff0c;虽然在一定程度上属于偷懒&#xff0c;但是在一些短频快的应用中还是很适用的&#xff0c;下面我就针对于这个测试做一些简单的分享&#xff0c;希望帮助到大家&#xff0c;在实际的开发中获得一些灵…

selenium篇-基础用法

Selenium WebDriver 是一款流行的自动化测试工具&#xff0c;用于模拟浏览器的各种操作。以下是一些Selenium WebDriver 中最常用的基本命令和方法摘要&#xff1a; 打开网页 (Get) 使用 get() 方法打开指定URL&#xff1a; Python 1driver.get("http://www.example.com&…

第63天:服务攻防-框架安全CVE 复现DjangoFlaskNode.JSJQuery

目录 思维导图 案例一&#xff1a;JavaScript-开发框架安全-Jquery&Node node.js目录穿越 CVE-2021-21315命令执行 Jquery CVE-2018-9207 案例二&#xff1a;Python-开发框架安全-Django&Flask django cve_2019_14234 CVE-2021-35042 flask ssti 思维导图 案…

HarmonyOS Next 视频弹幕功能

视频弹幕功能 介绍 本示例介绍如何使用ohos.danmakuflamemaster和ohos.gsyvideoplayer开发支持视频弹幕的播放器。可以自定义弹幕样式、占据屏幕宽度&#xff0c;发送弹幕&#xff0c;开关弹幕视图。 效果图预览 使用说明 点击播放按钮&#xff0c;进行视频播放&#xff0c…

layui框架实战案例(27):弹出二次验证

HTML容器 <button class"layui-btn layui-btn-sm layui-btn-danger" lay-event"delete"><i class"layui-icon layui-icon-delete"></i>批量删除</button>删除封装函数 function delAll(school_id, school_name) {var lo…

ZYNQ NVME高速存储之EXT4文件系统

前面文章分析了高速存储的各种方案&#xff0c;目前主流的三种存储方案是&#xff0c;pcie switch高速存储方案&#xff0c;zynq高速存储方案&#xff0c;fpga高速存储方案。虽然三种高速存储方案都可以实现高速存储&#xff0c;但是fpga高速存储方案是最烂的&#xff0c;fpga…

力扣 - 257. 二叉树的所有路径

题目链接 257. 二叉树的所有路径 题目描述 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;[“1->2…