开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情
前言
在上一篇文章中,我们提到了Dart的事件机制,其中Event队列的事件有一个重要的来源——Future。
那什么是Future呢?话不多说,下面让我们一起来看看。
正文
1. 概述
Future,中文名是未来。在Flutter开发中,我们会经常使用Future,特别是异步编程中,如:网络请求、本地数据存储请求(统称IO请求)。
Future如其名,表示延迟运行的对象,用来表示一个潜在的值返回或错误返回,这个返回值将在未来的某个时刻才可用。Future的调用者可以注册回调,一旦返回值或错误可用,就可以通过回调函数对其进行处理。
如果一个Fuction被async修饰,则该Fuction将会返回一个Future。要获取Future中的最终结果,可以以同步方式调用,即调用的时候使用await关键字进行等待,也可以异步调用,即用then的方式进行调用。可以说有点类似于 Javascript 中的 Promise。
此外,若是需要,我们还可以将一个Future调用后紧接着另一个Future完成,就是说Future的调用可以成串的。
2. 日常使用
一般的使用方法有两种,第一种是使用then。具体使用方式如下:
import 'package:http/http.dart' as http;
Future getData() {
final url = 'https://libv.miaodiapp.com';
return http.get(url).then((res) {
return res.body;
});
}
void main() {
getData().then((result) {
print(retult);
}).catchError((err) {
print(err);
});
print("finish");
}
控制台结果:
finish
网页body
上面的代码请求了一个网页,并将放回的网页的地址打印出来了。值得注意的是,调用完getData()以后,我们的程序没有等网页的body返回回来再继续执行,而是直接继续执行了下一句print,所以这就是为什么控制台结果先打印finish了。
另外一种方法是使用await,同步等待。
import 'package:http/http.dart' as http;
Future getData() async {
final url = 'https://libv.miaodiapp.com';
return http.get(url).then((res) {
return res.body;
});
}
void fun(){
var result = await getData();
print(result);
print("finish");
}
void main() {
fun();
}
控制台结果:
网页body
finish
这里就能实现了我们对网页先于finish的要求了。这种需求一般见于我们先异步请求A然后再异步请求B,B必须在A之前,所以就有了await的使用。