Flutter - 异步Future
创始人
2024-05-29 17:06:43
0

异步

future

Future 表示异步操作的结果 他有两种状态

  1. 未完成状态 :当调用异步函数时,他返回未完成的Future 并持续到异步函数操作完成;
  2. 完成状态:如果异步函数操作成功,则返回一个值;如果异步函数操作失败则返回一个错误

创建Future

import 'dart:match';
import 'dart:async';
int getInt(){
print('执行getInt的函数');
Random rng = Random();
return rng.nextInt(100);
}
void main(){
//此处调用的getint函数是int类型
Future future = Future(getInt);
//验证是否Future的实例
print(Future(getInt));
}

异步创建

import 'dart:match';
import 'dart:async';
int getInt() async{
print('执行getInt的函数');
Random rng = Random();
return rng.nextInt(100);
}
void main(){
//此处调用的getint函数是int类型
Future future = Future(getInt);
//验证是否Future的实例
print(Future(getInt));
}

使用Future

Future的类提供 then catchError whenCompete 三个函数对Future对象进行进一步处理,当异步操作成功时 执行then方法,then方法接受一个参数为异步操作返回值的回调函数。当异步操作失败时,执行catchError方法,catchError方法接受一个参数为错误对象的回调函数。当异步操作完成的时候无论失败还是成功都会调用whenCompete,而且wehnCompete方法接受一个无参的回调函数。

import 'dart:match';
import 'dart:async';
int getInt(){
print('执行getInt的函数');
Random rng = Random();
return rng.nextInt(100);
}
void main(){
//此处调用的getint函数是int类型
Future future = Future(getInt);
future.then((Object onValue){
print('异步调用成功,值为$onValue');
}).catchError((Object onError){
print('异步调用失败,值为$onError');
}).whenCompete((){
print('异步操作完成');
});
}

也可以使用await等待异步操作完成,使用await关键字必须使用async标记 ,并且使用try关键字捕获异常。

import 'dart:match';
import 'dart:async';
int getInt(){
print('执行getInt的函数');
Random rng = Random();
return rng.nextInt(100);
}
void main() async{
//此处调用的getint函数是int类型
Future future = Future(getInt);
try{
//使用await等待异步调用完成使其等同意同步代码var onvalue = await getInt();print('一步操作成功:$onvalue');
}on Excrption catch(onError){print('异步捕获失败:$onError');
}finally{print('异步捕获完成');
}
}

await关键字

在await表达式中,其值通常是Future,如果不是则会自动包装到Future中。Future关键字表示承诺返回一个对象。await表达式的值就是返回的对象。await表达式使执行暂停直到该对象可用为止。
如果异步不需要返回值,则将返回类型修改为Future< void >

Stream

Stream 是一系列异步事件的源。Stream提供了一种接收时间序列的方式,每个事件要么是数据事件 要么是错误事件(发生故障时的通知),当Stream发出所有事件后,单个done事件将通知侦听器已完成。

stream 和 Future的区别

  1. Future在异步操作中提供单个结果、错误、或者值。Stream提供多个结果;
  2. Future 通过函数处理结果,Stream通过listen;
  3. Future发送接收相同的值,Stream 可以使用辅助方法在值到达前处理;
//创建Stream
StreamController controller = StreamController(onListen: startTimer,onPause: stopTimer,onResume: startTimer,onCAncel: stoptimer
);
Stream stream = controller.stream;

StreamController 构造函数支持泛型,这里使用int类型。后遭函数提供了多个可选参数:
4. onlisten:监听Stream时调用的回调函数
5. onpause: 暂停调用的回调函数
6. onreaume: 恢复调用的回调函数
7. oncancel: 取消stream调用的回调函数
8. sync 布尔值,默认false ,同步stream标记

使用Stream

import 'dart:async';
Stream createStream(Duration interval,int maxCount){//定义流控制器StreamController controller;//定义定时器Timer timer;//计数变量int counter= 0void tick(_){counter++;controller.add(counter);//判断计数变量是否达到了最大值if(counter == maxCount){//关闭计时器timer.cancel();//关闭Stream并通知监听器controller.clase();}}
//启动计时器
void startTimer(){timer = Timer.periodic(interval,tick);
}void stopTimer(){
if (timer != null){
timer.cancel();
timer = null;
}
print('结束执行');
}
controller = StreamController(onListen: startTimer,onPause: stopTimer,onResume: startTimer,onCAncel: stoptimer
);
return controller.stream;
}void main() async{
Stream stream = createStream(const Duration(senconds:1),10);stream.listen((int value){print('来自createStream的值:$value');});
}

生成器函数

传统函数只会返回个单个值,生成器函数生成值的序列。生成器函数可以采用同步返回带有值的 Iterable 对象,在一部中返回Stream对象
关键字yield 返回单个值到序列,但不会停止生成器函数 。
生成器函数按需生成值,当开始迭代 iterator 或者开始监听 stream 才生成值。

同步生成器

Interable getNumbers(int number) sync* (print('开始执行');int k=0;while(k
print('创建interator');
for (int val in numbers){
print('$val');
}
}

异步生成器

Interable getNumbers(int number) async* (print('开始执行');int k=0;while(k
print('创建interator');
for (int val in numbers){
print('$val');
}
}

递归生成器

Interable getNumberRecursive(int number) sync* (print('开始执行,输出number:$number');if(numner>0){yield* getNumberRecursive(number - 1);}print('生成器执行结束number:$number');
)
void main (){
print('创建interator');
Interable numbers = getNumberRecursive(3);
for (int val in numbers){
print('$val');
}
}

相关内容

热门资讯

李光洁32天走7500公里吃8... 李光洁32天走7500公里吃8城,《拿一座城市下酒》这部纪录片怎么样?我觉得这部纪录片非常好,观看的...
每我世如你果只没界喜就欢的生一... 每我世如你果只没界喜就欢的生一爱有你过在想会。把这22个字组成一句话。我想过,如果在每一生只喜欢你,...
调查校园里的植物和动物说说有哪... 调查校园里的植物和动物说说有哪些动植物?可以分成几类?兰花,梅花可人丌··植物:乔木(杨树、柳树、银...
血脂高的原因? 血脂高的原因?血脂高的原因高血脂的诱因包括原发性和继发性两种:原发性高血脂症的病因:1、遗传因素。2...
为什么孩子总是重复看同一集动画... 为什么孩子总是重复看同一集动画片?是在传递这3个信号 小孩子爱看动画片是非常普遍的,动画片带给他们动...
终极三国里 49集刘备为什么这... 终极三国里 49集刘备为什么这么做?有没有官方回答?下集自己看吧 现在不会有官方回答的哟第一:可能真...
西式糕点制作大全的内容简介 西式糕点制作大全的内容简介《西式糕点制作大全》主要介绍了制作甜点的基本知识,例如各种制作工具,制作点...
逻辑思维又是什么?就是推理吗,... 逻辑思维又是什么?就是推理吗,怎么培养!?逻辑思维是一种严格分析思维。不一定是推理。推理是逻辑思维的...
囊萤夜读有一句俗语就是出自这个... 囊萤夜读有一句俗语就是出自这个故事你知道是什么吗?囊萤映雪 ( náng yíng yìng xuě...
什么是不伦恋情? 什么是不伦恋情?什么是不伦恋情.,?男跟女年龄相差很大?还是?男的比女的小?还是老夫少妻?是近亲谈恋...
有书名带晨星的嘛? 有书名带晨星的嘛?有书名带晨星的嘛?晨星传这本书。漫画书晨星物语
如果有些事情说不出口怎么办? 如果有些事情说不出口怎么办?烦恼皆是因为自己过分的执着 即使你在这样子下去 更不就不会有好的结果 为...
有哪些类似于《非自然死亡》题材... 有哪些类似于《非自然死亡》题材的日剧推荐?非自然死亡的题材电影确实不多,电视剧的话也不好找啊。不喜欢...
素书全集的内容简介 素书全集的内容简介 本书采用了《素书》的权威原著,参照《四库全书》并加上了宋代宰相张商英的注和清代王...
【世纪花园】小区对口的学校有重... 【世纪花园】小区对口的学校有重点小学和初中吗?世纪花园东区里有未来强者幼儿园,小区南边有个华兴小区,...
东南大学现有的专业中有哪些是属... 东南大学现有的专业中有哪些是属于老东南的1928年学校改名为国立中央大学,设理、工、医、农、文、法、...
一个男人一有钱就请朋友吃饭,没... 一个男人一有钱就请朋友吃饭,没钱就又说,买东西还赊账,商店里的老板都找上门来了?像陵念前这种男人的话...
坟上栽什么草好? 坟上栽什么草好?坟地种什么草好耐旱坟上栽野蕨草、扎根不深、浅根植物、可以固土、南方雨水多、不会造成坟...
关于国富潜力基金 关于国富潜力基金我9月24日上午买的国富基金,申购价格是9月24日开盘的价格吗?还是9月28日开盘的...
我是一个高中生。想学武术。在学... 我是一个高中生。想学武术。在学校没什么时间。是练散打还是跆拳道好。我是一个高中生。想学武术。在学校没...