在前面的文章中我们很多次提到了Future这个东西,这个单词翻译过来的意思是‘未来’的意思。在flutter中它表示一个未来某些时候返回数据的一个对象。
借助Future我们可以在Flutter实现异步操作,今天我们就来正式了解下Future。
首先我们知道Dart这门语言是单线程的。同步代码的执行会让我们的程序处于过长时间的等待状态终止ANR。
对于耗时的操作(I/O、网络操作等)我们必须要使用异步来处理它们,只有这样,才不会因为这些耗时的操作来影响程序的正常运行。
比如说我们去餐馆吃饭,在等餐的过程中我们一边和朋友聊天,一边玩手机。这个场景用代码表示如下:
运行下,看下控制台输出:
和朋友进入了一家餐馆 我们的菜来了,我要开始吃饭了 我们朋友聊起家常 等了好好久了,我还是玩会手机吧
从逻辑来看我们确实是先进入了餐馆,然后等待菜来,等的期间开始了聊天和玩手机。但是因为Dart是单线程的所以无论你等待饭来的时间多长,在这个操作没有完成之前他都不会去执行下面的操作,这样就不美好了啊,我在等吃饭的时间内什么也做不了了啊。
上面的例子就是非异步操作引起的问题。在Flutter要想解决上面的问题可以借助于Future来解决这个问题
下面我们就来看看什么是Future
Future是在未来某个时间获得想要对象的一种手段。
当调用Future后系统会将使用Future的操作放入一个队列中去排队执行,并返回一个未完成的Future对象,当事件完成后或者有一个可用的值时Future就会调用自己的then回调让调用者去处理这个对象。
在Flutter中我们可以使用如下两种方式来获取Future。
还是以上面的场景为例,我们先借助于Future APi来实现异步效果。
首先我们需要自己声明一个属于我们的Future对象。
我们个Future传入了我们需要的返回值类型String并且将我们需要耗时操作的函数传递给了Future,这样我们就可以获得一个Future对象。
在Future Api中我们可以使用
waitDinnerFuture.then((str){});接收上层返回可用的值 waitDinnerFuture.whenComplete((){});事件完成回调 waitDinnerFuture.catchError((error){});事件错误的捕获 waitDinnerFuture.timeout(new Duration(microseconds: 30));超时时间
好吧,也非常的简单,那么我就试下效果哈。
可以看到,在调用的地方吧我们只是处理了下调用等待吃饭的过程,其他的操作还是按照原来的去执行,在这里我们仅仅调用了then方法。来看下控制台输出。
和朋友进入了一家餐馆 我们朋友聊起家常 等了好好久了,我还是玩会手机吧 我们的菜来了,我要开始吃饭了
这样的话我们就可以在等餐的同时愉快的玩耍了。
同样的我们也可以借助于async和await来获取一个Future对象。
首先我们需要使用async来修饰需要异步处理的方法上,然后使用await来修饰需要异步操作的地方,然后 这个函数就可以返回一个Future对象了。
同样的我们来看下控制台的输出
和朋友进入了一家餐馆 我们朋友聊起家常 等了好好久了,我还是玩会手机吧 我们的菜来了,我要开始吃饭了
考虑三个功能expensiveA(),expensiveB()以及expensiveC()都返回Future对象
使用then()链接函数调用 当Future-returning函数需要按顺序运行时,请使用链式then() 调用:
等待多个Future以完成使用Future.wait() 如果功能的执行顺序不重要,可以使用 Future.wait()。
这些功能快速连续触发; 当他们都完成一个价值,Future.wait()返回一个新的未来。这个未来完成了包含每个函数产生的值的列表。
具体怎么使用还需要大家在用到的时候看下就好了。
点击左下角阅读原文,体验更佳阅读效果
我怀疑这个是个坏掉的二维码,分享到朋友圈试试?
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有