一映之、簡介
StreamSubscription 是訂閱Stream中的事件讨盒。當(dāng)對Stream使用listen
監(jiān)聽時父款,則返回一個StreamSubscription對象尾膊。StreamSubscription是對當(dāng)前Stream的監(jiān)聽產(chǎn)生的狀態(tài)的管理對象,它能獲取訂閱事件的狀態(tài)(是否被暫停)络凿、訂閱事件的取消骡送、訂閱事件的恢復(fù)以及保留用于處理事件的回調(diào)(onData
,onDone
,onError
)。
二絮记、構(gòu)建
對Stream使用listen
監(jiān)聽摔踱,即返回一個StreamSubscription對象,代碼如下:
// 構(gòu)建
void init() {
var stream = Stream.fromIterable([1, 2, 3, 4]);
StreamSubscription<int> streamSubscription = stream.listen((event) {});
print(streamSubscription);
}
三怨愤、屬性
-
isPaused -> bool
isPaused 是判斷Stream訂閱事件是否暫停派敷。實例代碼:
// isPaused void isPaused() { var stream = Stream.fromIterable([1, 2, 3, 4]); StreamSubscription<int> streamSubscription = stream.listen((event) {}); print(streamSubscription.isPaused); // false streamSubscription.pause(); print(streamSubscription.isPaused); // true streamSubscription.cancel(); }
四、方法
-
onData(void handleData(T data)?)
onData 是StreamSubscription的回調(diào)方法撰洗,在Stream發(fā)出事件時回調(diào)篮愉。實例代碼:
void onData() { var stream = Stream.fromIterable([1, 2, 3, 4]); StreamSubscription<int> streamSubscription = stream.listen((event) { print("Stream -- listen -- $event"); }); streamSubscription.onData((data) { print("StreamSubscription -- onData -- $data"); }); // streamSubscription.cancel(); }
日志輸出:
flutter: StreamSubscription -- onData -- 1 flutter: StreamSubscription -- onData -- 2 flutter: StreamSubscription -- onData -- 3 flutter: StreamSubscription -- onData -- 4
注意:
-
streamSubscription 的
cancle
方法不能調(diào)用,否則onData
接收不到Stream事件差导。 -
streamSubscription 的
onData
方法實現(xiàn)试躏,則Stream 的listen
方法的onData
不會調(diào)用,可傳 null。
-
streamSubscription 的
-
onDone(void handleDone()?)
onDone 是StreamSubscription的回調(diào)方法设褐,在Stream 事件發(fā)送完時回調(diào)該方法颠蕴。實例代碼:
void onDone() { var stream = Stream.fromIterable([1, 2, 3, 4]); StreamSubscription<int> streamSubscription = stream.listen(null); streamSubscription.onData((data) { print("StreamSubscription -- onData -- $data"); }); streamSubscription.onDone(() { print("StreamSubscription -- onDone"); }); }
日志輸出:
flutter: StreamSubscription -- onData -- 1 flutter: StreamSubscription -- onData -- 2 flutter: StreamSubscription -- onData -- 3 flutter: StreamSubscription -- onData -- 4 flutter: StreamSubscription -- onDone
-
onError(Function? handleError)
onError 是StreamSubscription的回調(diào)方法,在 Stream 發(fā)出錯誤事件時回調(diào)助析。實例代碼:
void onError() { var stream = Stream.error("對不起,出錯了"); StreamSubscription streamSubscription = stream.listen(null); streamSubscription.onData((data) { print("StreamSubscription -- onData -- $data"); }); streamSubscription.onDone(() { print("StreamSubscription -- onDone"); }); streamSubscription.onError((e) { print("StreamSubscription -- onError -- $e"); }); }
日志輸出:
flutter: StreamSubscription -- onError -- 對不起,出錯了 flutter: StreamSubscription -- onDone
注意:
onDone
方法也被調(diào)用犀被,切還在onError
之后。 -
cancel() -> Future<void>
cancel是取消對Stream的監(jiān)聽外冀。實例代碼:
void cancel() { var stream = Stream.fromIterable([1, 2, 3, 4]); StreamSubscription<int> streamSubscription = stream.listen(null); streamSubscription.onData((data) { print("StreamSubscription -- onData -- $data"); }); streamSubscription.cancel(); }
上面代碼沒有輸出弱判。
-
pause([Future<void>? resumeSignal]) -> void
&resume() -> void
pause是對Stream的訂閱者進行暫停;resume是對暫停的訂閱者進行恢復(fù)锥惋。實例代碼:
void pauseAndresume() { var stream = Stream.fromIterable([1, 2, 3, 4]); StreamSubscription<int> streamSubscription = stream.listen(null); streamSubscription.onData((data) { print("StreamSubscription -- onData -- $data"); }); streamSubscription.pause(); print(streamSubscription.isPaused); // true streamSubscription.resume(); print(streamSubscription.isPaused); // false }
注意:
如果實現(xiàn)
pause
的 Future 方法,則StreamSubcription 將撤銷暫停开伏,在 Future 完成時在恢復(fù)StreamSubcription膀跌。代碼如下:void pauseAndresume1() { var stream = Stream.fromIterable([1, 2, 3, 4]); StreamSubscription<int> streamSubscription = stream.listen(null); streamSubscription.onData((data) { print("StreamSubscription -- onData -- $data"); }); streamSubscription.pause(Future(() { print("pause -- future - 完成"); })); }
日志輸出:
pause -- future - 完成 flutter: StreamSubscription -- onData -- 1 flutter: StreamSubscription -- onData -- 2 flutter: StreamSubscription -- onData -- 3 flutter: StreamSubscription -- onData -- 4
上面的代碼同下:
void pauseAndresume1() { var stream = Stream.fromIterable([1, 2, 3, 4]); StreamSubscription<int> streamSubscription = stream.listen(null); streamSubscription.onData((data) { print("StreamSubscription -- onData -- $data"); }); streamSubscription.pause(); Future(() { print("pause -- future - 完成"); }).whenComplete(() => streamSubscription.resume()); }
-
asFuture<E>([E? futureValue]) -> Future<E>
asFuture 是將StreamSubscription的
onDone
和onError
的回調(diào)以Future的形式輸出,onDone
方法不再調(diào)用,而被Future的.then
取代;onError
方法也不調(diào)用固灵,而被Future的catchError
取代捅伤。實例代碼:onDone 取代
void asFuture() { var stream = Stream.fromIterable([1, 2, 3, 4]); StreamSubscription streamSubscription = stream.listen(null); streamSubscription.onData((data) { print("StreamSubscription -- onData -- $data"); }); streamSubscription.onDone(() { print("--onDone--"); }); streamSubscription.asFuture(Future(() { return "onDone & onError 合集"; })).then((value) { print("asFuture -- $value"); }).catchError((e) { print("asFuture --catchError -- $e"); }); }
日志輸出:
flutter: StreamSubscription -- onData -- 1 flutter: StreamSubscription -- onData -- 2 flutter: StreamSubscription -- onData -- 3 flutter: StreamSubscription -- onData -- 4 flutter: asFuture -- Instance of 'Future<String>'
onError 取代
void asFuture() { var stream = Stream.error("對不起我錯了"); StreamSubscription streamSubscription = stream.listen(null); streamSubscription.onData((data) { print("StreamSubscription -- onData -- $data"); }); streamSubscription.onError((e) { print("--onError-- $e"); }); streamSubscription.asFuture(Future(() { return "onDone & onError 合集"; })).then((value) { print("asFuture -- $value"); }).catchError((e) { print("asFuture --catchError -- $e"); }); }
日志輸出:
flutter: asFuture --catchError -- 對不起我錯了