
????????Future?表示一個不會立即完成的計算過程。與普通函數直接返回結果不同的是異步函數返回一個將會包含結果的?Future。該?Future?會在結果準備好時通知調用者。
????????Stream?是一系列異步事件的序列。其類似于一個異步的?Iterable,不同的是,當你向?Iterable?獲取下一個事件時它會立即給你,但是?Stream?則不會立即給你而是在它準備好時告訴你。
????????Future和Stream的本質區別是:Future中的任務會加入下一輪事件循環,而Stream中的任務則是加入微任務隊列。
Future 用于表示單個運算的結果,而 Stream 則表示多個結果的序列。
Stream中的執行異步的模式就是scheduleMicrotask。因為microtask的優先級又高于event。
所以,如果 microtask 太多就可能會對觸摸、繪制等外部事件造成阻塞卡頓。
????????一個Stream可以通過Stream.fromFuture方法將一個Future轉換為Stream,?也可以通過Stream.fromFutures將多個Future添加到Stream中。
????????Stream分為Single?Subscription和Broadcast兩種類型,?前者只允許訂閱(listen)一次,后者允許多次訂閱。
// 1. Single-Subscription
var data = [1, 2, '3.toString()', true, true, false, true, 6];
Stream stream = Stream.fromIterable(data).distinct();
stream.listen((event) => print('Liste1 -> Stream.fromIterable -> $event')).onDone(() => print('onDone1 -> Stream.fromIterable -> done 結束'));
stream //報錯.listen((event2) => print('Liste2 -> Stream.fromIterable -> $event2')).onDone(() => print('onDone2 -> Stream.fromIterable -> done 結束'));
// 2. Broadcast 所有數據被打印兩次
var data = [1, 2, '3.toString()', true, true, false, true, 6];
Stream stream = Stream.fromIterable(data).distinct();
stream = stream.asBroadcastStream();
stream.listen((event) => print('Liste1 -> Stream.fromIterable -> $event')).onDone(() => print('onDone1 -> Stream.fromIterable -> done 結束'));
stream .listen((event2) => print('Liste2 -> Stream.fromIterable -> $event2')).onDone(() => print('onDone2 -> Stream.fromIterable -> done 結束'));
????????通過StreamController向Stream中添加數據:
//1. 通過StreamController創建stream并添加數據(1)
StreamController<String> _streamControler = StreamController<String>();
_streamControler.stream.listen(onData:onData, onError: onError, onDone: onDone);
_streamControler.add(await getData());//2. 通過StreamController的Sink添加數據(2)
StreamController<String> _streamControl = StreamController<String>();
Sink _sink=_streamControler.sink;
_sink.add(await getData());
? ? ? ? 通過StreamBuilder可以用來實現界面的異步構建,其作用類似于FutureBuilder。但StreamBuilder能力更強,可以等待多個異步事件完成,然后再執行Widget的構建。
StreamBuilder<List<String>>(stream: dataStream,initialData: ["none"],///這里的 snapshot 是數據快照的意思builder: (BuildContext context, AsyncSnapshot<List<String>> snapshot) {///獲取到數據,為所欲為的更新 UIvar data = snapshot.data;return Container();});