flutter Stream流

在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();
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值