Flutter StreamController 异步通信、Stream 流异步通信

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


Flutter是谷歌推出的最新的移动开发框架。

【x1】微信公众号的每日提醒 随时随记 每日积累 随心而过

【x2】各种系列的视频教程 免费开源 关注 你不会迷路

【x3】系列文章 百万 Demo 随时 复制粘贴 使用


在 Flutter 中可用于异步通信的方案有如下:


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 {
  @override
  State<StatefulWidget> createState() {
    return _TestBPageState();
  }
}

class _TestBPageState extends State {
  ///消息订单对象
  StreamSubscription _streamSubscription;
  @override
  void initState() {
    super.initState();
    ///监听二
    _streamSubscription=streamController.stream.listen((event) {
      print("页面B接收到数据 $event");
    });
  }
  @override
  void dispose() {
    super.dispose();
    ///取消监听
    _streamSubscription.cancel();
  }
  ... ... 
}

StreamSubscription主要用来操作当前的监听事件,一个多订阅流中对应多个事件监听,那么也就会对应有多个 StreamSubscription,那么对于每个单独的事件监听就需要通过 StreamSubscription 对象来操作,详看本文目录3。

第三步发送数据 ,如点击一个按钮触发或者是网络请求数据结果分发给多个页面,当然这个是以实际业务为准。

streamController.add("测试数据");

第四步就是在整个流操作使用结束后关闭流

 @override
 void dispose() {
   super.dispose();
   streamController.close();
 }

2 单订阅流

单订阅流只允许有一个监听,默认使用 StreamController 的构造函数来创建,代码如下:

///创建单订阅流控制器
StreamController<String> streamSingController = StreamController();

然后对其设置监听与多订阅流方式一致:

class _TestBPageState extends State {
  ///消息订单对象
  StreamSubscription _streamSubscription;
  @override
  void initState() {
    super.initState();
    ///监听二
    _streamSubscription=streamSingController.stream.listen((event) {
      //然后在这里面进行更新数据的操作
      print("页面B接收到数据 $event");
    });
  }
  @override
  void 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();
}

完毕

早起的年轻人 CSDN认证博客专家 移动开发 项目管理 Java
只要用心去做,每一件事情还是有可能成功的,当然成功是没有界限的,只不过是达到自己心里的那个目标,公众号:我的大前端生涯,一个爱喝茶的程序员,通常会搞搞SpringBoot 、Herbinate、Mybatiys、Android、iOS、Flutter、Vue、小程序等.
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页