在flutter中 stream是很中重要的,在现在市场面flutter中的状态管理框架基本上都是用stream流来实现的
Stream分类
流可以分为两类:
单订阅流(Single Subscription),这种流最多只能有一个监听器(listener)
多订阅流(Broadcast),这种流可以有多个监听器监听(listener)
Stream创建方式
stream创建有很多种,Stream.fromFuture、Stream.fromIterable等方式,但是一般不使用这种,我们使用StreamController
- StreamController : 如类名描述,用于整个Stream过程的控制,提供各类接口用于创建各种事件流
- StreamSink: 一般作为事件的入口,提供如add,addStream等
- Stream: 事件源本身,一般可用于监听事件或者对事件进行转移,如listen、where。
- StreamSubscription: 事件订阅后的对象,表面上可用于管理订阅过等各类操作,如cancel、pause,同时在内部也是事件的中转关键。
单订阅流创建
//StreamController里面会创建一个Stream,我们实际操控的Stream
StreamController<String> streamController = StreamController();
streamController.stream.listen((data)=> print(data));
streamController.sink.add("11111");
streamController.add("2222");
streamController.close();
//多订阅流创建
StreamController<String> streamController = StreamController.broadcast();
streamController.stream.listen((data){
print(data);
},onError: (error){
print(error.toString());
});
streamController.stream.listen((data) => print(data));
streamController.add("bbb");
//单订阅流转为多订阅流
StreamController<String> streamController = StreamController();
Stream stream =streamController.stream.asBroadcastStream();
stream.listen((data) => print(data));
stream.listen((data) => print(data));
streamController.sink.add("aaa");
streamController.close();
上面很常见的StreamController 流创建
高阶使用
EventBus使用 好东西
//工具类
class EventBusHelper {
static final EventBus _eventBus = new EventBus();
EventBusHelper._();
static void fire(dynamic event) {
_eventBus.fire(event);
}
static Stream<EventType> getEventTypeStream<EventType>() {
return _eventBus.on<EventType>();
}
}
class ImageBackEvent {
final int code;
ImageBackEvent(this.code);
}
//接受
@override
void initState() {
super.initState();
this._loadHistoryData();
StreamSubscription stream =
EventBusHelper.getEventTypeStream<ImageBackEvent>().listen((event) {
//可以做自己操作
});
}
//发送
EventBusHelper.fire(ImageBackEvent(1))
eventBus源码
import 'dart:async';
class EventBus {
StreamController _streamController;
/// Controller for the event bus stream.
StreamController get streamController => _streamController;
EventBus({bool sync = false})
: _streamController = StreamController.broadcast(sync: sync);
EventBus.customController(StreamController controller)
: _streamController = controller;
//.where()监听满足给定条件的流中的数据
Stream<T> on<T>() {
if (T == dynamic) {
return streamController.stream;
} else {
return streamController.stream.where((event) => event is T).cast<T>();
}
}
/// Fires a new event on the event bus with the specified [event].
///
void fire(event) {
streamController.add(event);
}
/// Destroy this [EventBus]. This is generally only in a testing context.
///
void destroy() {
_streamController.close();
}
}