Flutter StreamController 异步通信、Stream 流异步通信
题记
—— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精。
Flutter是谷歌推出的最新的移动开发框架。
【x1】微信公众号的每日提醒 随时随记 每日积累 随心而过
【x2】各种系列的视频教程 免费开源 关注 你不会迷路
【x3】系列文章 百万 Demo 随时 复制粘贴 使用
在 Flutter 中可用于异步通信的方案有如下:
Provider ( Provider 异步通信、Provider状态管理)
ValueNotifier 点击查看详情
Stream: StreamController的使用详情 | StreamBuilder组件的结合使用 | StreamBuilder 实现的倒计时进度圆圈
EventBus (不考虑使用)
Bloc BLoC 异步通信、BlocBuilder的基本使用、BlocProvider的初探
Stream 是一个抽象类,用来表示一个序列的异步数据,Stream流分类:
单订阅流(Single Subscription),这种流最多只能有一个监听器(listener)
多订阅流(Broadcast),这种流可以有多个监听器监听(listener)
Stream可以接受任何类型的数据,Stream 有同步流和异步流之分,它们的区别在于同步流会在执行 add,addError 或 close 方法时会立即发送事件,而异步流总是在事件队列中的代码执行完成后再发送事件。
1 多订阅流
第一步创建流对象,在这里通过 流控制器 StreamController 来进行操作,下面的文章中会直接称流。
StreamController<String> streamController = StreamController.broadcast();
第二步设置流监听,业务开发中,设置多个监听,可以分别设置在页面 A、页面B中,然后在页面C中发送更新数据,在这中间需要注意的是添加listen监听后,返回订阅消息对象StreamSubscription,需要在页面销毁时通过 StreamSubscription 对象关闭对应的监听,否则就是造成监听无法移动,形成内存泄漏,核心代码如下代码清单1-1:
///代码清单 1-1
class TestBPage extends StatefulWidget {@overrideState<StatefulWidget> createState() {return _TestBPageState();}
}class _TestBPageState extends State {///消息订单对象StreamSubscription _streamSubscription;@overridevoid initState() {super.initState();///监听二_streamSubscription=streamController.stream.listen((event) {print("页面B接收到数据 $event");});}@overridevoid dispose() {super.dispose();///取消监听_streamSubscription.cancel();}... ...
}
StreamSubscription主要用来操作当前的监听事件,一个多订阅流中对应多个事件监听,那么也就会对应有多个 StreamSubscription,那么对于每个单独的事件监听就需要通过 StreamSubscription 对象来操作,详看本文目录3。
第三步发送数据 ,如点击一个按钮触发或者是网络请求数据结果分发给多个页面,当然这个是以实际业务为准。
streamController.add("测试数据");
第四步就是在整个流操作使用结束后关闭流
@overridevoid dispose() {super.dispose();streamController.close();}
2 单订阅流
单订阅流只允许有一个监听,默认使用 StreamController 的构造函数来创建,代码如下:
///创建单订阅流控制器
StreamController<String> streamSingController = StreamController();
然后对其设置监听与多订阅流方式一致:
class _TestBPageState extends State {///消息订单对象StreamSubscription _streamSubscription;@overridevoid initState() {super.initState();///监听二_streamSubscription=streamSingController.stream.listen((event) {//然后在这里面进行更新数据的操作print("页面B接收到数据 $event");});}@overridevoid dispose() {super.dispose();///取消监听_streamSubscription.cancel();}... ...
}
当再为其添加一个 listen 监听时,会报出异常:
════════ Exception caught by widgets library ═══════════════════════
The following StateError was thrown building Builder:
Bad state: Stream has already been listened to.
3 StreamSubscription
StreamSubscription主要用来操作当前的监听事件,它提供了一些操作方法如下:
取消消息订阅,此方法一般用在页面销毁时,执行后,订阅监听不可复用
@override
void dispose() {super.dispose();///取消消息订阅_streamSubscription.cancel();
}
///暂停消息订阅
if(!_streamSubscription.isPaused){_streamSubscription.pause();
}
///恢复消息订阅
if(_streamSubscription.isPaused){_streamSubscription.resume();
}
完毕
Flutter StreamController 异步通信、Stream 流异步通信相关推荐
- stream流对象的理解及使用
我的理解:用stream流式处理数据,将数据用一个一个方法去 . (点,即调用) 得到新的数据结果,可以一步达成. 有多种方式生成 Stream Source: 从 Collection 和数组 Co ...
- Cuda Stream流 分析
Cuda Stream流分析 Stream 一般来说,cuda c并行性表现在下面两个层面上: • Kernel level • Grid level Stream和event简介 Cuda stre ...
- CUDA 7 Stream流简化并发性
CUDA 7 Stream流简化并发性 异构计算是指高效地使用系统中的所有处理器,包括 CPU 和 GPU .为此,应用程序必须在多个处理器上并发执行函数. CUDA 应用程序通过在 streams ...
- Java8中Stream流对集合操作
java8中Stream流引入函数式编程思想,主要配合各种接口.lambda表达式.方法引用等方式,为集合的遍历.过滤.映射等提供非常"优雅"的操作方式. Student.java ...
- Java8 Stream流递归,几行代码搞定遍历树形结构
欢迎关注方志朋的博客,回复"666"获面试宝典 可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中 ...
- 【Java8新特性】面试官问我:Java8中创建Stream流有哪几种方式?
写在前面 先说点题外话:不少读者工作几年后,仍然在使用Java7之前版本的方法,对于Java8版本的新特性,甚至是Java7的新特性几乎没有接触过.真心想对这些读者说:你真的需要了解下Java8甚至以 ...
- 10.Stream流
一.Stream流 1.案例实现 按照下面的要求完成集合的创建和遍历 创建一个集合,存储多个字符串元素 把集合中所有以"张"开头的元素存储到一个新的集合 把"张" ...
- JDK8新特性之Stream流
是什么是Stream流 java.util.stream.Stream Stream流和传统的IO流,它们都叫流,却是两个完全不一样的概念和东西. 流可以简单的说是处理数据集合的东西,可以申明式流式A ...
- list转map stream_advancedday10可变参数不可变集合及Stream流
可变参数 可变参数指的是,方法参数的个数可以发生改变.但是其本质是一个数组,在方法把可变参数当做数组来使用就可以了. //可变参数的格式:数据类型...参数名public static void 方法 ...
最新文章
- html5 settimeout,计时器setTimeout()
- 大公司为什么还在采用过时的技术
- iOS进阶之架构设计MVVM模式仿新闻项目(6)
- linux自动对齐命令,linux查看硬盘4K对齐方法
- 「JupyterNotebook-bug」Jupyter Notebook卸载已安装的第三方库不能输入yes的问题
- linux下安装Mysql(干货!!!)解决mysql 1130问题,远程登录问题
- mysql 日期和时间函数_介绍一下mysql的日期和时间函数
- 仿拉钩app(一)---爬虫数据准备
- 360金融发布城市信用排行榜:上海、苏州位列前两位
- 测试freenas9.1搭建iscsi磁盘库
- java手机号正则校验工具类
- 三角网导线平差实例_导线三角网平差计算中的Wd是什么意思啊?怎么的算出来的?...
- matlab下载svm,svm工具箱下载-matlab svm工具箱下载通用版-极限软件园
- 用python 调用whatsapp自动发消息
- Elasticsearch _reindex Alias使用
- js 操作数组 push splice
- iOS基础——UI控件之UIAlertController、UINavigationController、Segue、SVProgressHUD
- 射频信号源进阶使用技巧【转载自微信公众号微波射频网】
- 人重要的是知耻而后勇
- 【奇怪知识点】百事有雪碧吗?
热门文章
- 精度、延迟两不误,移动端性能新SOTA,谷歌TF开源轻量级EfficientNet
- 详解李兰娟团队重大抗疫药物成果:2款处方药,体外试验有奇效,已在浙江临床使用...
- 收藏 | 使用PyTorch时,最常见的4个错误
- SeDuMi教程(1)
- 笔记本卡顿不流畅是什么原因_为什么越来越多的笔记本电池不可拆卸
- php写入rabbit速度,RabbitMQ 入门教程(PHP) 实现延迟功能
- c++求区间第k大数_翔哥炒股经验23 K线形态学50节 第10节:K线区间震荡
- Java 线程之间通信
- MacBook 没有响应的应用程序 CUH
- 计算机系统结构专业是什么专业,中国大学计算机系统结构专业排名