## 參考資料
[Flutter完整開發實戰詳解(十一、全面深入理解Stream)](https://juejin.im/post/5cc2acf86fb9a0321f042041)
[異步UI更新(FutureBuilder、StreamBuilder)](https://book.flutterchina.club/chapter7/futurebuilder_and_streambuilder.html)
## Dart中的Stream
`Stream`就是事件流或者管道,事件流相信大家并不陌生,簡單的說就是:**基于事件流驅動設計代碼,然后監聽訂閱事件,并針對事件變換處理響應**。
在 Flutter 中,整個`Stream`設計外部暴露的對象主要如下圖,主要包含了`StreamController`、`Sink`、`Stream`、`StreamSubscription`四個對象。

~~~
class DataBloc{
///控制器
StreamController<List<String>> _dataController = StreamController<List<String>>();
///事件的入口
StreamSink<List<String>> get _dataSink => _dataController.sink;
///獲取 Stream 用于監聽
Stream<List<String>> get _dataStream => _dataController.stream;
///事件訂閱對象
StreamSubscription _dataSubscription;
init(){
///監聽事件
_dataSubscription = _dataStream.listen((value){
print(value);
});
_dataSink.add(["first", "second", "three", "more"]);
}
close() {
///關閉
_dataSubscription.cancel();
_dataController.close();
}
}
~~~
個人理解:
StreamController:一個大管家
StreamSink:用于發送事件
Stream\StreamSubscription:用于監聽,StreamSubscription是Stream產生的
## Flutter中的Stream
在 Flutter 中通過`StreamBuilder``StreamBuilder`配合`Stream`來展示流上事件(數據)變化的UI組件。下面看一下`StreamBuilder`的默認構造函數:
~~~
StreamBuilder({
Key key,
this.initialData,
Stream<T> stream,
@required this.builder,
})
~~~
* `stream`:`StreamBuilder`依賴的`stream`
* `initialData`:初始數據,用戶設置默認數據。
* `builder`:Widget構建器;該構建器會在`Future`執行的不同階段被多次調用,構建器簽名如下:
~~~
Function (BuildContext context, AsyncSnapshot snapshot)
~~~
`snapshot`會包含當前異步任務的狀態信息及結果信息 ,比如我們可以通過`snapshot.connectionState`獲取異步任務的狀態信息、通過`snapshot.hasError`判斷異步任務是否有錯誤等等,完整的定義讀者可以查看`AsyncSnapshot`類定義。
另外,`FutureBuilder`的`builder`函數簽名和`StreamBuilder`的`builder`是相同的。
例子:
~~~
Widget buildStreanBuilder() {
return StreamBuilder<List<String>>(
stream: _dataStream,
initialData: ["none"],
///這里的 snapshot 是數據快照的意思
builder: (BuildContext context, AsyncSnapshot<List<String>> snapshot) {
///獲取到數據,為所欲為的更新 UI
var data = snapshot.data;
return new Text(data.toString());
});
}
~~~