- 可以通過 await for 循環來讀取 stream 的數據,在循環結束時也是stream關閉的時候,反之亦然。
- 在一個stream 方法中,通過 yield 向await for 傳遞消息
- stream 可以通過 listen 方法來監聽
- 通過對函數聲明 async* 表示該函數是一個stream,參考代碼1
- listen方法會返回 StreamSubscription 對象,可以通過返回的對象設置 onData onDone onError 方法
- StreamSubscription 有 callback 、cencal、pause、resume 方法,可以接收數據、取消監聽、暫停監聽、恢復監聽
- 對於 onDone 方法,如果訂閱方主動取消監聽,是無法觸發的
- Stream 可以單次訂閱和廣播訂閱
- stream 可以通過 transform 方法對數據進行加工,然後再傳遞給 listen 方法處理, 需要通過 StreamTransformer 創建 transform
- streamController 入口叫做 sink,出口就是 stream
- 可以通過 Stream<T>.periodic 來執行一個循環定時的輸出流,參考代碼2
- 可以通過 Stream 中的 skip 方法跳過流,通過 where 方法過濾流, 通過 transform 方法轉換流
代碼1:
Stream s = streamTest();
s.listen((v){
print(v);
});
Stream<int> streamTest() async * {
for(var i = 0;i<=10;i++){
yield i;
}
}
代碼2:
Stream x = Stream<String>.periodic(Duration(seconds: 1),timePer);
x.listen((v){
print(v);
});
String timePer(int x) {
// ignore: omit_local_variable_types
x+=1;
return 'run in ${x.toString()} times';
}
學習資料:
1、http://www.flutterj.com/?post=103
2、https://juejin.im/post/5d3a91d1e51d457778117479#heading-18