Flutter 三点三:Dart Stream
Stream
- Stream用于接收异步事件
- Stream 可以接收多个异步事件
- Stream.listen()方法返回StreamSubscription 可用于取消事件订阅,取消后,不再接收事件
基本使用
Stream.fromFutures([Future.delayed(Duration(seconds: 1),(){return "事件1";}),Future.delayed(Duration(seconds: 3),(){return "事件2";}),Future.delayed(Duration(seconds: 5),(){return "事件3";})]).listen((event) {print("${DateTime.now().millisecondsSinceEpoch} >> "+event);}).onDone(() {print("${DateTime.now().millisecondsSinceEpoch} >> onDone");});Stream.fromFutures([Future.delayed(Duration(seconds: 1),(){return "事件1";}),Future.delayed(Duration(seconds: 3),(){return "事件2";}),Future.delayed(Duration(seconds: 5),(){return "事件3";})]).listen((event) {print("${DateTime.now().millisecondsSinceEpoch} >> "+event);},onError: (error){},onDone: (){});
运行结果
1703817812594 >> 事件1
1703817814583 >> 事件2 //2s后打印
1703817816574 >> 事件3 //2s后打印
1703817816578 >> onDone
另外一种使用方式 更加灵活
var streamController = StreamController();streamController.stream.listen((event) {print(event);});streamController.add("事件1");streamController.add("事件2");streamController.add("事件3");
运行结果
事件1
事件2
事件3
由结果可以看出,Stream类似于rxjava
Stream.listen()方法返回StreamSubscription 可用于取消事件订阅,取消后,不再接收事件
未取消订阅
StreamController streamController = StreamController();StreamSubscription streamSubscription = streamController.stream.listen((event) {print(event);});streamController.add("事件1");streamController.add("事件2");Future((){sleep(Duration(seconds: 2));// streamSubscription.cancel();streamController.add("事件3");});
结果
事件1
事件2
事件3
取消订阅后
StreamController streamController = StreamController();StreamSubscription streamSubscription = streamController.stream.listen((event) {print(event);});streamController.add("事件1");streamController.add("事件2");Future((){sleep(Duration(seconds: 2));streamSubscription.cancel();streamController.add("事件3");});
结果
事件1
事件2
StreamController
构造函数参数表示stream的生命周期
/**
onListen: 监听开始开始
onPause:监听暂停
onResume:监听重启
onCancel:监听取消
sync :同步 or 异步
*/factory StreamController({void onListen()?,void onPause()?,void onResume()?,FutureOr<void> onCancel()?,bool sync = false}) {return sync? _SyncStreamController<T>(onListen, onPause, onResume, onCancel): _AsyncStreamController<T>(onListen, onPause, onResume, onCancel);}
StreamController streamController = StreamController(onListen: (){print("onListen");},onPause: (){print("onPause");},onResume: (){print("onResume");},onCancel: (){print("onCancel");},);StreamSubscription streamSubscription = streamController.stream.listen((event) {print(event);});streamController.add("事件1");streamSubscription.pause();streamSubscription.resume();streamController.add("事件2");Future((){sleep(Duration(seconds: 2));streamSubscription.cancel();streamController.add("事件3");});
运行结果:
onListen
onPause
事件1
事件2
onResume
onCancel
Stream其他构造方法
void main() async{Stream.value(1).listen((event) {print(event);});Stream.fromIterable([2,3,4,5]).listen((event) {print(event);});//结合await使用Stream stream = Stream.fromIterable([6,7,8,9]);await for(var i in stream){print(i);}
}
运行结果:
1
2
6
3
7
4
8
5
9
Stream.periodic 每隔多长时间执行一次任务
Stream.periodic(Duration(seconds: 2),(computationCount){return "它死啦,它火啦,它死啦才火啦!${computationCount}";}).take(5) //执行5次 不设置一直执行.listen((event) {print(event);});
运行结果
它死啦,它火啦,它死啦才火啦!0
它死啦,它火啦,它死啦才火啦!1
它死啦,它火啦,它死啦才火啦!2
它死啦,它火啦,它死啦才火啦!3
它死啦,它火啦,它死啦才火啦!4
async* 标记的方法称为异步生成器,yield生成单个元素,yield*生成多个元素,最终汇集成流
void main(){createStream().listen((event) {print("${DateTime.now().millisecondsSinceEpoch} >> ${event}");});
}Stream<int> createStream() async*{for(int i=0;i<10;i++){sleep(Duration(seconds: 1)); //1s钟生成一个yield i;}
}
//结果
1703821955894 >> 0
1703821956912 >> 1
1703821957921 >> 2
1703821958929 >> 3
1703821959940 >> 4
1703821960953 >> 5
1703821961960 >> 6
1703821962971 >> 7
1703821963982 >> 8
1703821964993 >> 9
相关文章:
Flutter 三点三:Dart Stream
Stream Stream用于接收异步事件Stream 可以接收多个异步事件Stream.listen()方法返回StreamSubscription 可用于取消事件订阅,取消后,不再接收事件 基本使用 Stream.fromFutures([Future.delayed(Duration(seconds: 1),(){return "事件1";})…...
centos 防火墙 设置 LTS
centos 防火墙 设置 LTS https://blog.csdn.net/m0_58805648/article/details/130671008...
SAP缓存 表缓存( Table Buffering)
本文主要介绍SAP中的表缓存在查询数据,更新数据时的工作情况以及对应概念。 SAP表缓存的工作 查询数据 更新数据 删除数据 表缓存的概念 表缓存技术设置属性 不允许缓冲: 允许缓冲,但已关闭: 缓冲已激活: 已…...
Mybatis插件入门
专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…...
DOA估计算法——迭代自适应算法(IAA)
1 简介 迭代自适应法 (Iterative Adaptive Approach,IAA)估计算法最早由美国的电气工程师和数学家Robert Schmidt和Roy A. Kuc在1986年的一篇论文"Multiple Emitter Location and Signal Parameter Estimation"中首次提出了这一算法, IAA DOA …...
Python If语句以及代码块的基本介绍
if语句 在编程中if语句是一种根据条件执行不同代码块的控制结构,他根据条件的真假来分支程序的执行路径,所以我们可以通过if语句根据不同情况而执行不同的程序 格式 if [条件(bool值或者计算结果为bool类型的算式)] : a11if a>10:print("a大于10") # --> a大…...
[嵌入式专栏](FOC - SVPWM扇区计算Part1)
文章目录 1 . 概要2 . 扇区计算2.1 扇区Ⅰ计算2.2 扇区Ⅱ计算2.3 扇区Ⅲ计算 3 . 小结 【极客技术传送门】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 1 . 概要 经过扇区判断后,就知道在哪个扇区进行输出了 【Q】但是每个扇区分别输出怎样的结…...
亚马逊美国站ASTM F2613儿童折叠椅和凳子强制性安全标准
ASTM F2613折叠椅和凳子安全标准 美国消费品安全委员会(CPSC)发布的ASTM F2613儿童折叠椅和凳子的强制性安全标准,已于2020年7月6日生效,并被纳入联邦法规《16 CFR 1232儿童折叠椅和凳子安全标准》。 亚马逊要求在美国站上架的儿…...
【机组期末速成】指令系统|机器指令概述|操作数类型与操作类型|寻址方式|指令格式
🎥 个人主页:深鱼~🔥收录专栏:计算机组成原理🌄欢迎 👍点赞✍评论⭐收藏 目录 前言: 一、本章考点总览 二、考点分析 1、以下有关指令系统的说法中错误的是( )。 2…...
java美容管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 java Web美容管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…...
Redis哨兵
1.哨兵介绍 1.1.为何需要哨兵? 为了解决master节点宕机问题,选举salve节点为新的master节点。 1.2.哨兵的作用 1.3.服务状态监控 1.4.选举新的master 1.5.如何实现故障转移 2.搭建哨兵集群 2.1.集群结构 这里我们搭建一个三节点形成的Sentinel集群&…...
面试算法78:合并排序链表
题目 输入k个排序的链表,请将它们合并成一个排序的链表。 分析:利用最小堆选取值最小的节点 用k个指针分别指向这k个链表的头节点,每次从这k个节点中选取值最小的节点。然后将指向值最小的节点的指针向后移动一步,再比较k个指…...
鸿鹄电子招投标系统:基于Spring Boot、Mybatis、Redis和Layui的企业电子招采平台源码与立项流程
在数字化时代,企业需要借助先进的数字化技术来提高工程管理效率和质量。招投标管理系统作为企业内部业务项目管理的重要应用平台,涵盖了门户管理、立项管理、采购项目管理、采购公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理等…...
node.js对应npm安装和使用
介绍 node.js是一个基于 Chrome V8 引擎的 JavaScript 运行环境,安装node后自带npm。NPM :Node Package ManagerNPM是Node.js标准的软件包管理器 。2010年底,Node.js 的包管理器 npm 诞生,是全球最大的开源库生态系统。 node 20…...
(self-supervised learning)Event Camera Data Pre-training
Publisher: ICCV 2023 MOTIVATION OF READING: 自监督学习、稀疏事件 NILM link: https://arxiv.org/pdf/2301.01928.pdf Code: GitHub - Yan98/Event-Camera-Data-Pre-training 1. Overview Contributions are summarized as follows: 1. A self-supervised framework f…...
关于个人Git学习记录及相关
前言 可以看一下猴子都能懂的git入门,图文并茂不枯燥 猴子都能懂的git入门 学习东西还是建议尽可能的去看官方文档 权威且详细 官方文档 强烈建议看一下GitHub漫游指南及开源指北,可以对开源深入了解一下,打开新世界的大门! …...
【eclipse】eclipse开发springboot项目使用入门
下载eclipse Eclipse downloads - Select a mirror | The Eclipse Foundation 安装eclipse 其他一步一步即可 我们是开发java web选择如下 界面修改 Window->Preferences-> 修改eclipse风格主题 Window->Preferences->General->Appearance 修改字体和大小…...
Android 13 默认关闭 快速打开相机
介绍 在设置菜单的手势界面里,快速打开相机是默认开启的,此功能当开启时连续点击两次电源键会打开相机,现在客户需要默认关闭。 效果展示 修改 这里一开始想到的就是配置文件,在路径下果然找到了,从注释中看使我们需要的&#x…...
pytest pytest-html优化样式
conftest.py import pytest from pytest_metadata.plugin import metadata_keydef pytest_html_report_title(report):report.title"接口测试报告"def pytest_configure(config):# 获取命令行参数中的测试环境、测试版本、开始时间、测试人员config.stash[metadata_…...
Visual Studio 配置DLL
我们在用Visual Studio进行开发时,如果没有正确配置DLL,就会出现类似“丢失***.dll”的错误。DLL配置有哪些方法? 1、手动复制 将dll文件拷贝到生成的.exe所在的文件夹里 2、配置环境 在右键属性->配置属性->调试->环境…...
形式化验证正在成为C语言开发者的“新编译器”:2024年头部车规芯片厂强制启用的3层验证准入机制
第一章:形式化验证为何成为C语言开发者的“新编译器”传统C语言开发依赖编译器检测语法错误与基础类型不匹配,但对内存越界、空指针解引用、整数溢出、数据竞争等深层语义缺陷无能为力。形式化验证工具(如CBMC、Frama-C、Kani)在编…...
STM32F405实战:基于CubeMX与HAL库,实现SimpleFOC霍尔传感器精准驱动
1. 硬件准备与电路分析 先说说我这次用的硬件配置:一块STM32F405开发板,搭配中空三相无刷电机和霍尔传感器。霍尔传感器的三个输出引脚分别接在PB4(A相)、PB5(B相)和PC9(C相)上&…...
Qwen-Image惊艳作品集:Qwen-VL生成的30组高质量图文推理链(含错误分析与修正)
Qwen-Image惊艳作品集:Qwen-VL生成的30组高质量图文推理链(含错误分析与修正) 1. 视觉语言模型的惊艳表现 Qwen-VL作为通义千问推出的视觉语言模型,在多模态理解与推理方面展现出令人印象深刻的能力。基于RTX 4090D 24GB显存环境…...
移动宽带也能玩转远程桌面?手把手教你用IPv6直连家里电脑(含防火墙设置避坑指南)
移动宽带用户如何通过IPv6实现高效远程桌面连接 1. IPv6远程桌面连接的基础原理与优势 IPv6作为下一代互联网协议,其128位地址长度彻底解决了IPv4地址枯竭问题。对于移动宽带用户而言,IPv6的最大价值在于每个联网设备都能获得独立的公网地址,…...
OFA-VE模型微调实战:适配特定领域任务
OFA-VE模型微调实战:适配特定领域任务 1. 引言 你是否遇到过这样的情况:一个在通用场景下表现不错的AI模型,到了你的专业领域就变得不太灵光了?比如在医疗影像分析中,模型可能无法准确理解医学术语和影像的对应关系&…...
垃圾网站穷疯了,什么都要钱
垃圾。。。。。...
如何快速生成轻量级社交分享按钮:sharingbuttons.io完整指南
如何快速生成轻量级社交分享按钮:sharingbuttons.io完整指南 【免费下载链接】sharingbuttons.io Quickly generate social sharing buttons with a tiny performance footprint 项目地址: https://gitcode.com/gh_mirrors/sh/sharingbuttons.io sharingbutt…...
李慕婉-仙逆-造相Z-Turbo与ChatGPT协同创作系统
李慕婉-仙逆-造相Z-Turbo与ChatGPT协同创作系统 当文字遇见画面,创意从此无界 还记得那些深夜构思小说场景,却苦于找不到合适配图的时刻吗?或者为产品描述绞尽脑汁,却无法快速生成匹配的视觉内容?这些问题困扰着无数内…...
Flutter 状态管理为什么总是“选型焦虑”?
子玥酱 (掘金 / 知乎 / CSDN / 简书 同名) 大家好,我是 子玥酱,一名长期深耕在一线的前端程序媛 👩💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚…...
YDB-100A传动轴专用平衡机
YDB-100A传动轴专用平衡机一、用途特点:该系列为硬支承卧式动平衡机,采用滚轮支承,圈带拖动,普通型为双速电机驱动,“A"型为变频电机加变频器调速,由工业控制计算机进行数据处理,彩色屏幕实…...
