文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Flutter Future异步如何创建

2023-07-05 11:27

关注

本篇内容介绍了“Flutter Future异步如何创建”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

异步

future

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

创建Future

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

Future在异步操作中提供单个结果、错误、或者值。Stream提供多个结果;

Future 通过函数处理结果,Stream通过listen;

Future发送接收相同的值,Stream 可以使用辅助方法在值到达前处理;

//创建StreamStreamController<int> controller = StreamController<int>(onListen: startTimer,onPause: stopTimer,onResume: startTimer,onCAncel: stoptimer);Stream stream = controller.stream;

StreamController 构造函数支持泛型,这里使用int类型。后遭函数提供了多个可选参数:

onlisten:监听Stream时调用的回调函数

onpause: 暂停调用的回调函数

onreaume: 恢复调用的回调函数

oncancel: 取消stream调用的回调函数

sync 布尔值,默认false ,同步stream标记

使用Stream

import 'dart:async';Stream<int> createStream(Duration interval,int maxCount){//定义流控制器StreamController<int> 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<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');});}

生成器函数

传统函数只会返回个单个值,生成器函数生成值的序列。生成器函数可以采用同步返回带有值的 Iterable 对象,在一部中返回Stream对象

关键字yield 返回单个值到序列,但不会停止生成器函数 。

生成器函数按需生成值,当开始迭代 iterator 或者开始监听 stream 才生成值。

同步生成器

Interable<int> getNumbers(int number) sync* (print('开始执行');int k=0;while(k<number) yield k++;print('生成器执行结束');)void main (){print('创建interator');for (int val in numbers){print('$val');}}

异步生成器

Interable<int> getNumbers(int number) async* (print('开始执行');int k=0;while(k<number) yield k++;print('生成器执行结束');)void main (){print('创建interator');for (int val in numbers){print('$val');}}

递归生成器

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

“Flutter Future异步如何创建”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯