欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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);
//驗證是否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)的解決方法

    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
  • Flutter替換字符串中的html標(biāo)簽

    Flutter替換字符串中的html標(biāo)簽

    這篇文章主要為大家介紹了Flutter替換字符串中的html標(biāo)簽實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2023-05-05
  • 淺析Android企業(yè)級開發(fā)數(shù)據(jù)綁定技術(shù)

    淺析Android企業(yè)級開發(fā)數(shù)據(jù)綁定技術(shù)

    這篇文章通過代碼實例分析了Android企業(yè)級開發(fā)數(shù)據(jù)綁定技術(shù)的應(yīng)用以及相關(guān)的原理知識,跟著小編一起學(xué)習(xí)參考下吧。
    2017-12-12
  • Android selector背景選擇器的使用詳解

    Android selector背景選擇器的使用詳解

    本篇文章是對Android中selector背景選擇器的使用進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • Android實用小技巧之利用Lifecycle寫出更好維護的代碼

    Android實用小技巧之利用Lifecycle寫出更好維護的代碼

    lifecycle是一個類,用于存儲有關(guān)組件(如Activity或Fragment)的生命周期狀態(tài)的信息,并允許其他對象觀察此狀態(tài),下面這篇文章主要給大家介紹了關(guān)于Android實用小技巧之利用Lifecycle寫出更好維護的代碼的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • Android手機開發(fā)設(shè)計之記事本功能

    Android手機開發(fā)設(shè)計之記事本功能

    這篇文章主要為大家詳細(xì)介紹了Android手機開發(fā)設(shè)計之記事本功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Android中實現(xiàn)詞組高亮TextView方法示例

    Android中實現(xiàn)詞組高亮TextView方法示例

    高亮顯示大家應(yīng)該都不陌生,在開發(fā)中經(jīng)常會遇到這個需求,所以下面這篇文章主要給大家介紹了關(guān)于Android中實現(xiàn)詞組高亮TextView的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-10-10
  • Flutter路由的跳轉(zhuǎn)、動畫和傳參詳解(最簡單)

    Flutter路由的跳轉(zhuǎn)、動畫和傳參詳解(最簡單)

    這篇文章主要給大家介紹了關(guān)于Flutter路由的跳轉(zhuǎn)、動畫和傳參的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Android的消息機制

    Android的消息機制

    本文主要介紹了Android的消息機制。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • Android View的事件分發(fā)機制深入分析講解

    Android View的事件分發(fā)機制深入分析講解

    事件分發(fā)從手指觸摸屏幕開始,即產(chǎn)生了觸摸信息,被底層系統(tǒng)捕獲后會傳遞給Android的輸入系統(tǒng)服務(wù)IMS,通過Binder把消息發(fā)送到activity,activity會通過phoneWindow、DecorView最終發(fā)送給ViewGroup。這里就直接分析ViewGroup的事件分發(fā)
    2023-01-01

最新評論