题记
—— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精。
Flutter是谷歌推出的最新的移动开发框架。
在 Flutter 中可用于异步通信的方案有如下:
-
Provider ( Provider 异步通信、Provider状态管理)
-
ValueNotifier 点击查看详情
-
Stream: StreamController的使用详情 | StreamBuilder组件的结合使用 | StreamBuilder 实现的倒计时进度圆圈
-
EventBus (不考虑使用)
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();
}
完毕