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事件將通知偵 聽(tīng)器已完成。
stream和Future的區(qū)別
1. Future在異步操作中提供單個(gè)結(jié)果、錯(cuò)誤、或者值。Stream提供多個(gè)結(jié)果;
2. Future 通過(guò)函數(shù)處理結(jié)果,Stream通過(guò)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)聽(tīng)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)聽(tīng)器
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('來(lái)自createStream的值:$value');
});
}
生成器函數(shù)
傳統(tǒng)函數(shù)只會(huì)返回個(gè)單個(gè)值,生成器函數(shù)生成值的序列。生成器函數(shù)可以采用同步返回帶有值的 Iterable 對(duì)象,在一部中返回Stream對(duì)象
關(guān)鍵字yield 返回單個(gè)值到序列,但不會(huì)停止生成器函數(shù) 。
生成器函數(shù)按需生成值,當(dāng)開(kāi)始迭代 iterator 或者開(kāi)始監(jiān)聽(tīng) stream 才生成值。
同步生成器
Interable<int> getNumbers(int number) sync* (
print('開(kāi)始執(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('開(kāi)始執(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('開(kāi)始執(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)文章
將Eclipse工程轉(zhuǎn)Android Studio工程的步驟與注意事項(xiàng)
這篇文章主要給大家介紹了將Eclipse工程轉(zhuǎn)Android Studio工程的方法步驟,并給大家分享了其中的一些注意事項(xiàng),文中將實(shí)現(xiàn)的步驟一步步介紹的非常詳細(xì),需要的朋友們可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
android中NFC讀寫(xiě)功能的實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了android中NFC讀寫(xiě)功能的實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
使用Android系統(tǒng)提供的DownloadManager來(lái)下載文件
本篇文章主要介紹了使用Android系統(tǒng)提供的DownloadManager來(lái)下載文件,可以將長(zhǎng)時(shí)間的下載任務(wù)交給系統(tǒng),完全由系統(tǒng)管理,有需要的可以了解下。2016-11-11
android通過(guò)代碼的形式來(lái)實(shí)現(xiàn)應(yīng)用程序的方法
因?yàn)閼?yīng)用程序的安裝與卸載模塊在android系統(tǒng)中已經(jīng)寫(xiě)好了,所以我們只需要激活就行了2013-10-10
Android為按鈕控件綁定事件的五種實(shí)現(xiàn)方式
本篇文章主要是介紹了Android為按鈕控件綁定事件的五種實(shí)現(xiàn)方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-11-11
Android仿IOS UIAlertView對(duì)話框
這篇文章主要為大家詳細(xì)介紹了Android仿IOS UIAlertView對(duì)話框,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
GridView實(shí)現(xiàn)桌面圖標(biāo)顯示案例
這篇文章主要為大家詳細(xì)介紹了GridView實(shí)現(xiàn)桌面圖標(biāo)顯示案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
Android開(kāi)發(fā)之OpenGL繪制2D圖形的方法分析
這篇文章主要介紹了Android開(kāi)發(fā)之OpenGL繪制2D圖形的方法,結(jié)合實(shí)例形式分析了Android使用OpenGL ES的圖形繪制組件實(shí)現(xiàn)2D圖形繪制的原理、步驟及相關(guān)代碼注意事項(xiàng),需要的朋友可以參考下2017-09-09
自己實(shí)現(xiàn)Android View布局流程
這篇文章主要介紹了自己實(shí)現(xiàn)Android View布局流程,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-03-03

