题记
—— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精。


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 流异步通信相关推荐

  1. stream流对象的理解及使用

    我的理解:用stream流式处理数据,将数据用一个一个方法去 . (点,即调用) 得到新的数据结果,可以一步达成. 有多种方式生成 Stream Source: 从 Collection 和数组 Co ...

  2. Cuda Stream流 分析

    Cuda Stream流分析 Stream 一般来说,cuda c并行性表现在下面两个层面上: • Kernel level • Grid level Stream和event简介 Cuda stre ...

  3. CUDA 7 Stream流简化并发性

    CUDA 7 Stream流简化并发性 异构计算是指高效地使用系统中的所有处理器,包括 CPU 和 GPU .为此,应用程序必须在多个处理器上并发执行函数. CUDA 应用程序通过在 streams ...

  4. Java8中Stream流对集合操作

    java8中Stream流引入函数式编程思想,主要配合各种接口.lambda表达式.方法引用等方式,为集合的遍历.过滤.映射等提供非常"优雅"的操作方式. Student.java ...

  5. Java8 Stream流递归,几行代码搞定遍历树形结构

    欢迎关注方志朋的博客,回复"666"获面试宝典 可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中 ...

  6. 【Java8新特性】面试官问我:Java8中创建Stream流有哪几种方式?

    写在前面 先说点题外话:不少读者工作几年后,仍然在使用Java7之前版本的方法,对于Java8版本的新特性,甚至是Java7的新特性几乎没有接触过.真心想对这些读者说:你真的需要了解下Java8甚至以 ...

  7. 10.Stream流

    一.Stream流 1.案例实现 按照下面的要求完成集合的创建和遍历 创建一个集合,存储多个字符串元素 把集合中所有以"张"开头的元素存储到一个新的集合 把"张" ...

  8. JDK8新特性之Stream流

    是什么是Stream流 java.util.stream.Stream Stream流和传统的IO流,它们都叫流,却是两个完全不一样的概念和东西. 流可以简单的说是处理数据集合的东西,可以申明式流式A ...

  9. list转map stream_advancedday10可变参数不可变集合及Stream流

    可变参数 可变参数指的是,方法参数的个数可以发生改变.但是其本质是一个数组,在方法把可变参数当做数组来使用就可以了. //可变参数的格式:数据类型...参数名public static void 方法 ...

最新文章

  1. html5 settimeout,计时器setTimeout()
  2. 大公司为什么还在采用过时的技术
  3. iOS进阶之架构设计MVVM模式仿新闻项目(6)
  4. linux自动对齐命令,linux查看硬盘4K对齐方法
  5. 「JupyterNotebook-bug」Jupyter Notebook卸载已安装的第三方库不能输入yes的问题
  6. linux下安装Mysql(干货!!!)解决mysql 1130问题,远程登录问题
  7. mysql 日期和时间函数_介绍一下mysql的日期和时间函数
  8. 仿拉钩app(一)---爬虫数据准备
  9. 360金融发布城市信用排行榜:上海、苏州位列前两位
  10. 测试freenas9.1搭建iscsi磁盘库
  11. java手机号正则校验工具类
  12. 三角网导线平差实例_导线三角网平差计算中的Wd是什么意思啊?怎么的算出来的?...
  13. matlab下载svm,svm工具箱下载-matlab svm工具箱下载通用版-极限软件园
  14. 用python 调用whatsapp自动发消息
  15. Elasticsearch _reindex Alias使用
  16. js 操作数组 push splice
  17. iOS基础——UI控件之UIAlertController、UINavigationController、Segue、SVProgressHUD
  18. 射频信号源进阶使用技巧【转载自微信公众号微波射频网】
  19. 人重要的是知耻而后勇
  20. 【奇怪知识点】百事有雪碧吗?

热门文章

  1. 精度、延迟两不误,移动端性能新SOTA,谷歌TF开源轻量级EfficientNet
  2. 详解李兰娟团队重大抗疫药物成果:2款处方药,体外试验有奇效,已在浙江临床使用...
  3. 收藏 | 使用PyTorch时,最常见的4个错误
  4. SeDuMi教程(1)
  5. 笔记本卡顿不流畅是什么原因_为什么越来越多的笔记本电池不可拆卸
  6. php写入rabbit速度,RabbitMQ 入门教程(PHP) 实现延迟功能
  7. c++求区间第k大数_翔哥炒股经验23 K线形态学50节 第10节:K线区间震荡
  8. Java 线程之间通信
  9. MacBook 没有响应的应用程序 CUH
  10. 计算机系统结构专业是什么专业,中国大学计算机系统结构专业排名