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');
}
}

相关内容

热门资讯

你的晚安是我的早安是什么歌曲 你的晚安是我的早安是什么歌曲苏天伦《你的早安是我的晚安》“你的晚安是我的早安”是单小源的歌曲《东京遇...
积极进取的小故事 积极进取的小故事现代的普通人,不要名人的。不能与别人重复,尽快回答   啄木鸟的故事       啄...
熊出没之探险日记3什么时候播出... 熊出没之探险日记3什么时候播出?熊出没之探险日记3,春节前播放。熊出没只是探险日记三2020年5月4...
谁知道所有有关“七”的歌?拜托... 谁知道所有有关“七”的歌?拜托了各位 谢谢就是歌曲名里有“七”这个字的!谢谢七月七迅谈日晴 看我七十...
求一本小说 女主穿越了三次 每... 求一本小说 女主穿越了三次 每次都在福临身边 后来怀孕了孩子被打掉了那个 女主叫什么雯?那个女主就是...
如果记忆不说话,流年也会开出花... 如果记忆不说话,流年也会开出花的基本信息书 名:《如果记忆不弯饥好说话,流年也会开出花》埋铅 作 者...
你好,旧时光漫画版在哪里可以看... 你好,旧时光漫画版在哪里可以看?暂时在绘心上连载
一首英文歌,男的组合唱的,MV... 一首英文歌,男的组合唱的,MV是一个婚礼的过程。求歌名。是不是darin的can'tstoplove...
为什么很多人喜欢用胶片相机? 为什么很多人喜欢用胶片相机?有一种情怀叫做“怀旧“吧,现在数码相机越来越普遍了,已经到了”全民摄影“...
女主先爱上男主,男主却不喜欢女... 女主先爱上男主,男主却不喜欢女主或者是另有所爱,最后女主男主还是在一起的穿越小说。有木有再生缘:我的...
爱情失恋伤感句子 爱情失恋伤感句子越是美好的从前,越幸福的曾经,现在只能带来锥心的疼痛,痛到撕心裂肺,肝肠寸断,终于痛...
24岁穿这个会不会显老 24岁穿这个会不会显老有点显老,这个颜色款式,颜色有点暗,没有活力,属于那种气质佳,长得高雅的女人,...
哈尔的移动城堡英语版 哈尔的移动城堡英语版可以发给我吗度盘~请查收~
秦时明月之万里长城什么时候播 秦时明月之万里长城什么时候播据说是今年暑假开播别急,官网什么的信他你就输了,12年之前底应该会出,杭...
孩子会得抽动症吗? 孩子会得抽动症吗?我天生的气性比较大,有时跟别人斗嘴时候就会手脚哆嗦,麻木,我问一下这是不是抽动症就...
亨德尔一生为音乐献出了怎样的贡... 亨德尔一生为音乐献出了怎样的贡献?亨德尔一生写了歌剧41部,清唱剧21部,以及大量的管乐器与弦乐器的...
礼仪起源和发展的经典故事? 礼仪起源和发展的经典故事?一、礼仪的起源;1、天神生礼仪;2、礼为天地人的统一体;3、礼产生于人的自...
描写桂林山水的句子有哪些? 描写桂林山水的句子有哪些?天下风光数桂林有杨万里的“梅花五岭八桂林,青罗带绕碧玉簪”;有邹应龙的“无...
避免与强敌正面对决的成语 避免与强敌正面对决的成语避免与强敌正面对决的成语避实就虚 【近义】避重就轻、避难就易、声东击西【反义...
多愁善感类的成语 多愁善感类的成语心细如发【解释】:极言小心谨慎,考虑周密。亦作“心细于发”。【出自】:吴梅《题天香石...