聊聊 Bloc event 的队列属性

在Flutter中有state的概念,我们使用Bloc进行状态管理,通过Bloc.addEvent的方式进行事件传递,状态变更。关于Bloc的基础用法,可以查阅Bloc官网相关资料,这里我们仅记录一下Bloc的队列等待。

首先,我们新建一个Bloc类:

class TestBloc extends Bloc<TestEvent, TestState> {
  TestBloc() : super(new TestState());

  @override
  Stream<TestState> mapEventToState(TestEvent event) async* {
    if (event is TestEventA) {
      print("A");
      await Future.delayed(Duration(seconds: 2));
      print("finish A await");
    } else if (event is TestEventB) {
      print("B");
    }
  }
}

abstract class TestEvent {}

class TestEventA extends TestEvent {}

class TestEventB extends TestEvent {}

class TestState {}

如上,定义了一个最基础的Bloc,事件A,事件B。我们接收到事件A后延时等待了2秒钟,用于验证Bloc的Event Loop是否具有阻塞性。

新建一个页面main.dart, 添加按钮事件,同时给bloc发送事件A和事件B:

//...省略非关键代码
onPressed: (){
          _bloc.add(TestEventA());
          _bloc.add(TestEventB());
    }
现象:

print("A") 打印后,等待了2秒,打印 "finish A await", 然后才响应到事件B的触发。

结论:

Bloc 的 event 队列是一个阻塞性队列,先进先出,只有当上一个事件消费完毕后,才会触发响应队列中的下一个事件。


解释开发中所遇到的问题现象:

在 await 前面addEvent,会阻塞线程,造成事件的接收延时,但在await前面 yeild 不受影响,可以在延时前收到状态变更

Stream队列是否也是有序的?

通过代码测试,流内消息体的顺序与加入的顺序无关,与消息体本身的耗时正相关。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容