Flutter Future異步操作詳細(xì)講解
異步
future
Future 表示異步操作的結(jié)果 他有兩種狀態(tài)
- 未完成狀態(tài) :當(dāng)調(diào)用異步函數(shù)時,他返回未完成的Future 并持續(xù)到異步函數(shù)操作完成;
- 完成狀態(tài):如果異步函數(shù)操作成功,則返回一個值;如果異步函數(shù)操作失敗則返回一個錯誤
創(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); //驗證是否Future<int>的實例 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); //驗證是否Future<int>的實例 print(Future(getInt)); }
使用Future
Future的類提供 then catchError whenCompete 三個函數(shù)對Future對象進行進一步處理,當(dāng)異步操作成功時 執(zhí)行then方法,then方法接受一個參數(shù)為異步操作返回值的回調(diào)函數(shù)。當(dāng)異步操作失敗時,執(zhí)行catchError方法,catchError方法接受一個參數(shù)為錯誤對象的回調(diào)函數(shù)。當(dāng)異步操作完成的時候無論失敗還是成功都會調(diào)用whenCompete,而且wehnCompete方法接受一個無參的回調(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,如果不是則會自動包裝到Future中。Future關(guān)鍵字表示承諾返回一個對象。await表達(dá)式的值就是返回的對象。await表達(dá)式使執(zhí)行暫停直到該對象可用為止。
如果異步不需要返回值,則將返回類型修改為Future< void >
Stream
Stream 是一系列異步事件的源。Stream提供了一種接收時間序列的方式,每個事件要么是數(shù)據(jù)事件 要么是錯誤事件(發(fā)生故障時的通知),當(dāng)Stream發(fā)出所有事件后,單個done事件將通知偵 聽器已完成。
stream和Future的區(qū)別
1. Future在異步操作中提供單個結(jié)果、錯誤、或者值。Stream提供多個結(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ù)提供了多個可選參數(shù):
4. onlisten:監(jiān)聽Stream時調(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; //定義定時器 Timer timer; //計數(shù)變量 int counter= 0 void tick(_){ counter++; controller.add(counter); //判斷計數(shù)變量是否達(dá)到了最大值 if(counter == maxCount){ //關(guān)閉計時器 timer.cancel(); //關(guān)閉Stream并通知監(jiān)聽器 controller.clase(); } } //啟動計時器 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ù)只會返回個單個值,生成器函數(shù)生成值的序列。生成器函數(shù)可以采用同步返回帶有值的 Iterable 對象,在一部中返回Stream對象
關(guān)鍵字yield 返回單個值到序列,但不會停止生成器函數(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android 8.0中一些坑以及對應(yīng)的解決方法
這篇文章主要給大家介紹了關(guān)于Android 8.0中一些坑以及對應(yīng)的解決方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09淺析Android企業(yè)級開發(fā)數(shù)據(jù)綁定技術(shù)
這篇文章通過代碼實例分析了Android企業(yè)級開發(fā)數(shù)據(jù)綁定技術(shù)的應(yīng)用以及相關(guān)的原理知識,跟著小編一起學(xué)習(xí)參考下吧。2017-12-12Android實用小技巧之利用Lifecycle寫出更好維護的代碼
lifecycle是一個類,用于存儲有關(guān)組件(如Activity或Fragment)的生命周期狀態(tài)的信息,并允許其他對象觀察此狀態(tài),下面這篇文章主要給大家介紹了關(guān)于Android實用小技巧之利用Lifecycle寫出更好維護的代碼的相關(guān)資料,需要的朋友可以參考下2022-05-05Android中實現(xiàn)詞組高亮TextView方法示例
高亮顯示大家應(yīng)該都不陌生,在開發(fā)中經(jīng)常會遇到這個需求,所以下面這篇文章主要給大家介紹了關(guān)于Android中實現(xiàn)詞組高亮TextView的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-10-10Flutter路由的跳轉(zhuǎn)、動畫和傳參詳解(最簡單)
這篇文章主要給大家介紹了關(guān)于Flutter路由的跳轉(zhuǎn)、動畫和傳參的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01