序
在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)。