最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Flutter Future異步操作詳細(xì)講解

 更新時間:2023年03月10日 10:35:40   作者:lingjunjie  
這篇文章主要介紹了Flutter Future異步操作,future是Future類的對象,其表示一個T類型的異步操作結(jié)果。如果異步操作不需要結(jié)果,則future的類型可為Future

異步

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);
//驗(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 三個函數(shù)對Future對象進(jìn)行進(jìn)一步處理,當(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)文章

最新評論

双江| 南溪县| 德化县| 通山县| 朝阳区| 乌拉特后旗| 巨鹿县| 滕州市| 鄄城县| 高密市| 慈溪市| 巴里| 余干县| 清水县| 夏津县| 灯塔市| 循化| 清丰县| 黄梅县| 剑川县| 浏阳市| 壤塘县| 兴宁市| 亳州市| 大宁县| 潞西市| 农安县| 弥勒县| 阿尔山市| 潮州市| 筠连县| 新郑市| 赤城县| 承德县| 若羌县| 临清市| 钟山县| 留坝县| 沂南县| 阿巴嘎旗| 荣成市|