聊聊 Bloc event 的隊(duì)列屬性

在Flutter中有state的概念,我們使用Bloc進(jìn)行狀態(tài)管理,通過(guò)Bloc.addEvent的方式進(jìn)行事件傳遞,狀態(tài)變更。關(guān)于Bloc的基礎(chǔ)用法,可以查閱Bloc官網(wǎng)相關(guān)資料,這里我們僅記錄一下Bloc的隊(duì)列等待。

首先,我們新建一個(gè)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 {}

如上,定義了一個(gè)最基礎(chǔ)的Bloc,事件A,事件B。我們接收到事件A后延時(shí)等待了2秒鐘,用于驗(yàn)證Bloc的Event Loop是否具有阻塞性。

新建一個(gè)頁(yè)面main.dart, 添加按鈕事件,同時(shí)給bloc發(fā)送事件A和事件B:

//...省略非關(guān)鍵代碼
onPressed: (){
          _bloc.add(TestEventA());
          _bloc.add(TestEventB());
    }
現(xiàn)象:

print("A") 打印后,等待了2秒,打印 "finish A await", 然后才響應(yīng)到事件B的觸發(fā)。

結(jié)論:

Bloc 的 event 隊(duì)列是一個(gè)阻塞性隊(duì)列,先進(jìn)先出,只有當(dāng)上一個(gè)事件消費(fèi)完畢后,才會(huì)觸發(fā)響應(yīng)隊(duì)列中的下一個(gè)事件。


解釋開(kāi)發(fā)中所遇到的問(wèn)題現(xiàn)象:

在 await 前面addEvent,會(huì)阻塞線程,造成事件的接收延時(shí),但在await前面 yeild 不受影響,可以在延時(shí)前收到狀態(tài)變更

Stream隊(duì)列是否也是有序的?

通過(guò)代碼測(cè)試,流內(nèi)消息體的順序與加入的順序無(wú)關(guān),與消息體本身的耗時(shí)正相關(guān)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容