Flutter Future異步操作詳細(xì)講解
異步
future
Future 表示異步操作的結(jié)果 他有兩種狀態(tài)
- 未完成狀態(tài) :當(dāng)調(diào)用異步函數(shù)時(shí),他返回未完成的Future 并持續(xù)到異步函數(shù)操作完成;
- 完成狀態(tài):如果異步函數(shù)操作成功,則返回一個(gè)值;如果異步函數(shù)操作失敗則返回一個(gè)錯(cuò)誤
創(chuàng)建Future
import 'dart:match'; import 'dart:async'; int getInt(){ print('執(zhí)行g(shù)etInt的函數(shù)'); Random rng = Random(); return rng.nextInt(100); } void main(){ //此處調(diào)用的getint函數(shù)是int類型 Future<int> future = Future(getInt); //驗(yàn)證是否Future<int>的實(shí)例 print(Future(getInt)); }
異步創(chuàng)建
import 'dart:match'; import 'dart:async'; int getInt() async{ print('執(zhí)行g(shù)etInt的函數(shù)'); Random rng = Random(); return rng.nextInt(100); } void main(){ //此處調(diào)用的getint函數(shù)是int類型 Future<int> future = Future(getInt); //驗(yàn)證是否Future<int>的實(shí)例 print(Future(getInt)); }
使用Future
Future的類提供 then catchError whenCompete 三個(gè)函數(shù)對(duì)Future對(duì)象進(jìn)行進(jìn)一步處理,當(dāng)異步操作成功時(shí) 執(zhí)行then方法,then方法接受一個(gè)參數(shù)為異步操作返回值的回調(diào)函數(shù)。當(dāng)異步操作失敗時(shí),執(zhí)行catchError方法,catchError方法接受一個(gè)參數(shù)為錯(cuò)誤對(duì)象的回調(diào)函數(shù)。當(dāng)異步操作完成的時(shí)候無(wú)論失敗還是成功都會(huì)調(diào)用whenCompete,而且wehnCompete方法接受一個(gè)無(wú)參的回調(diào)函數(shù)。
import 'dart:match'; import 'dart:async'; int getInt(){ print('執(zhí)行g(shù)etInt的函數(shù)'); Random rng = Random(); return rng.nextInt(100); } void main(){ //此處調(diào)用的getint函數(shù)是int類型 Future<int> future = Future(getInt); future.then((Object onValue){ print('異步調(diào)用成功,值為$onValue'); }).catchError((Object onError){ print('異步調(diào)用失敗,值為$onError'); }).whenCompete((){ print('異步操作完成'); }); }
也可以使用await等待異步操作完成,使用await關(guān)鍵字必須使用async標(biāo)記 ,并且使用try關(guān)鍵字捕獲異常。
import 'dart:match'; import 'dart:async'; int getInt(){ print('執(zhí)行g(shù)etInt的函數(shù)'); Random rng = Random(); return rng.nextInt(100); } void main() async{ //此處調(diào)用的getint函數(shù)是int類型 Future<int> future = Future(getInt); try{ //使用await等待異步調(diào)用完成使其等同意同步代碼 var onvalue = await getInt(); print('一步操作成功:$onvalue'); }on Excrption catch(onError){ print('異步捕獲失?。?onError'); }finally{ print('異步捕獲完成'); } }
await關(guān)鍵字
在await表達(dá)式中,其值通常是Future,如果不是則會(huì)自動(dòng)包裝到Future中。Future關(guān)鍵字表示承諾返回一個(gè)對(duì)象。await表達(dá)式的值就是返回的對(duì)象。await表達(dá)式使執(zhí)行暫停直到該對(duì)象可用為止。
如果異步不需要返回值,則將返回類型修改為Future< void >
Stream
Stream 是一系列異步事件的源。Stream提供了一種接收時(shí)間序列的方式,每個(gè)事件要么是數(shù)據(jù)事件 要么是錯(cuò)誤事件(發(fā)生故障時(shí)的通知),當(dāng)Stream發(fā)出所有事件后,單個(gè)done事件將通知偵 聽器已完成。
stream和Future的區(qū)別
1. Future在異步操作中提供單個(gè)結(jié)果、錯(cuò)誤、或者值。Stream提供多個(gè)結(jié)果;
2. Future 通過函數(shù)處理結(jié)果,Stream通過listen;
3. Future發(fā)送接收相同的值,Stream 可以使用輔助方法在值到達(dá)前處理;
//創(chuàng)建Stream StreamController<int> controller = StreamController<int>( onListen: startTimer, onPause: stopTimer, onResume: startTimer, onCAncel: stoptimer ); Stream stream = controller.stream;
StreamController 構(gòu)造函數(shù)支持泛型,這里使用int類型。后遭函數(shù)提供了多個(gè)可選參數(shù):
4. onlisten:監(jiān)聽Stream時(shí)調(diào)用的回調(diào)函數(shù)
5. onpause: 暫停調(diào)用的回調(diào)函數(shù)
6. onreaume: 恢復(fù)調(diào)用的回調(diào)函數(shù)
7. oncancel: 取消stream調(diào)用的回調(diào)函數(shù)
8. sync 布爾值,默認(rèn)false ,同步stream標(biāo)記
使用Stream
import 'dart:async'; Stream<int> createStream(Duration interval,int maxCount){ //定義流控制器 StreamController<int> controller; //定義定時(shí)器 Timer timer; //計(jì)數(shù)變量 int counter= 0 void tick(_){ counter++; controller.add(counter); //判斷計(jì)數(shù)變量是否達(dá)到了最大值 if(counter == maxCount){ //關(guān)閉計(jì)時(shí)器 timer.cancel(); //關(guān)閉Stream并通知監(jiān)聽器 controller.clase(); } } //啟動(dòng)計(jì)時(shí)器 void startTimer(){ timer = Timer.periodic(interval,tick); } void stopTimer(){ if (timer != null){ timer.cancel(); timer = null; } print('結(jié)束執(zhí)行'); } controller = StreamController<int>( onListen: startTimer, onPause: stopTimer, onResume: startTimer, onCAncel: stoptimer ); return controller.stream; } void main() async{ Stream<int> stream = createStream(const Duration(senconds:1),10); stream.listen((int value){ print('來自createStream的值:$value'); }); }
生成器函數(shù)
傳統(tǒng)函數(shù)只會(huì)返回個(gè)單個(gè)值,生成器函數(shù)生成值的序列。生成器函數(shù)可以采用同步返回帶有值的 Iterable 對(duì)象,在一部中返回Stream對(duì)象
關(guān)鍵字yield 返回單個(gè)值到序列,但不會(huì)停止生成器函數(shù) 。
生成器函數(shù)按需生成值,當(dāng)開始迭代 iterator 或者開始監(jiān)聽 stream 才生成值。
同步生成器
Interable<int> getNumbers(int number) sync* ( print('開始執(zhí)行'); int k=0; while(k<number) yield k++; print('生成器執(zhí)行結(jié)束'); ) void main (){ print('創(chuàng)建interator'); for (int val in numbers){ print('$val'); } }
異步生成器
Interable<int> getNumbers(int number) async* ( print('開始執(zhí)行'); int k=0; while(k<number) yield k++; print('生成器執(zhí)行結(jié)束'); ) void main (){ print('創(chuàng)建interator'); for (int val in numbers){ print('$val'); } }
遞歸生成器
Interable<int> getNumberRecursive(int number) sync* ( print('開始執(zhí)行,輸出number:$number'); if(numner>0){ yield* getNumberRecursive(number - 1); } print('生成器執(zhí)行結(jié)束number:$number'); ) void main (){ print('創(chuàng)建interator'); Interable<int> numbers = getNumberRecursive(3); for (int val in numbers){ print('$val'); } }
到此這篇關(guān)于Flutter Future異步操作詳細(xì)講解的文章就介紹到這了,更多相關(guān)Flutter Future異步操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android 8.0中一些坑以及對(duì)應(yīng)的解決方法
這篇文章主要給大家介紹了關(guān)于Android 8.0中一些坑以及對(duì)應(yīng)的解決方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09淺析Android企業(yè)級(jí)開發(fā)數(shù)據(jù)綁定技術(shù)
這篇文章通過代碼實(shí)例分析了Android企業(yè)級(jí)開發(fā)數(shù)據(jù)綁定技術(shù)的應(yīng)用以及相關(guān)的原理知識(shí),跟著小編一起學(xué)習(xí)參考下吧。2017-12-12Android實(shí)用小技巧之利用Lifecycle寫出更好維護(hù)的代碼
lifecycle是一個(gè)類,用于存儲(chǔ)有關(guān)組件(如Activity或Fragment)的生命周期狀態(tài)的信息,并允許其他對(duì)象觀察此狀態(tài),下面這篇文章主要給大家介紹了關(guān)于Android實(shí)用小技巧之利用Lifecycle寫出更好維護(hù)的代碼的相關(guān)資料,需要的朋友可以參考下2022-05-05Android手機(jī)開發(fā)設(shè)計(jì)之記事本功能
這篇文章主要為大家詳細(xì)介紹了Android手機(jī)開發(fā)設(shè)計(jì)之記事本功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Android中實(shí)現(xiàn)詞組高亮TextView方法示例
高亮顯示大家應(yīng)該都不陌生,在開發(fā)中經(jīng)常會(huì)遇到這個(gè)需求,所以下面這篇文章主要給大家介紹了關(guān)于Android中實(shí)現(xiàn)詞組高亮TextView的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-10-10Flutter路由的跳轉(zhuǎn)、動(dòng)畫和傳參詳解(最簡(jiǎn)單)
這篇文章主要給大家介紹了關(guān)于Flutter路由的跳轉(zhuǎn)、動(dòng)畫和傳參的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01Android View的事件分發(fā)機(jī)制深入分析講解
事件分發(fā)從手指觸摸屏幕開始,即產(chǎn)生了觸摸信息,被底層系統(tǒng)捕獲后會(huì)傳遞給Android的輸入系統(tǒng)服務(wù)IMS,通過Binder把消息發(fā)送到activity,activity會(huì)通過phoneWindow、DecorView最終發(fā)送給ViewGroup。這里就直接分析ViewGroup的事件分發(fā)2023-01-01