Flutter - 了解Flutter和Dart中的Future
Future数据类型的概念很容易理解。虽然官方文档已经很好地解释了这个概念,但在本文中我将尝试用我自己的语言解释它,如果你还没有,那么希望能帮助你理解它。
![](https://img.haomeiwen.com/i17203299/973060b6d81883e3.png)
当函数返回一个Future
类型,意味着它的结果需要一段时间才能准备好,结果将来可用。
函数的最着名的例子可能需要一些时间才能返回结果,http.get(url)
这通常用于调用RESTFul API,我们必须发送HTTP请求并等待响应。在以下示例中,http.get()
方法返回一个Future
对象:
final response = http.get(url);
调用一个返回Future的函数,不会阻塞你的代码,这就是为什么该函数被称为异步的原因。相反,它会立即返回一个Future对象,该对象最初是未完成的。
Future<T>
表示异步操作的结果是类型T
。例如,如果函数返回Future<String>
,这意味着将来它会为您提供一个字符串。
为了练习,我们可以使用Future 构造函数之一来创建自己的Future对象。以下代码创建的实例Future<String>
将立即完成。请注意我们如何提供匿名函数作为Future的构造函数的参数。此匿名函数的返回值确定实例化的future对象的类型。这里的“最新消息”属于类型String
,因此Future<String>
将创建一个实例。
Future<String> future = Future(() => "Latest News");
future.then((news) {
print(news);
});
为了模拟一段时间后完成的Future,我们可以使用[Future.delayed](https://api.dartlang.org/stable/2.2.0/dart-async/Future/Future.delayed.html)
构造函数。future
以下示例中的对象将在两秒后完成:
Future<String> future = Future.delayed(
Duration(seconds: 2),
() => "Latest News",
);
future.then((news) {
print(news);
});
只有在未来完成时,才能获得未来的结果。
您可以使用以下任一关键字访问Future的结果:
- then
- await
假设该getNews
函数返回一个实例Future<String>
。
Future<String> getNews() async {
final response = await http.get(url);
return response.body;
}
您可以通过以下任一方式使用此函数的结果:
getNews().then((news) {
print(news);
});
要么
String news = await getNews();
print(news);
请注意,await
关键字只能在async
函数体中使用:
Future<void> foo() async {
String news = await getNews();
print(news);
}
async
函数的结果必须是一个Future
。
提示:如果函数返回
Future
,则认为它是异步的; 您不需要使用async
关键字标记此函数的主体。该async
关键字是必需的只有当您使用的await
关键字在你的函数体。
如果你的异步函数没有返回任何东西(例如,如果它只打印一些东西),函数的返回类型应该是Future<void>
。
then
关键字还返回一个Future
,这意味着您可以将它们链接起来:
getNews().then(…).then(…).then(…)
Future<T>
返回的then
关键字类型取决于正文中定义的函数的返回值then
。
调用
then()
返回一个新的Future
,它将使用then()
回调返回的值完成。
以下代码是一个真实的例子。在这段代码中,我使用了permission_handler包来检查应用程序是否有权访问手机联系人。该checkPermissionStatus
函数返回一个future对象。
使用then
检查权限:
void _listenForPermissionStatus() {
final Future<PermissionStatus> statusFuture =
PermissionHandler().checkPermissionStatus(PermissionGroup.contacts);
statusFuture.then((PermissionStatus status) {
_permissionStatus = status;
if (status != PermissionStatus.granted) {
requestPermission(PermissionGroup.contacts);
} else {
loadContacts();
}
});
}
使用await
检查权限:
Future<void> _listenForPermissionStatus() async {
final Future<PermissionStatus> statusFuture =
PermissionHandler().checkPermissionStatus(PermissionGroup.contacts);
PermissionStatus _permissionStatus = await statusFuture;
if (_permissionStatus != PermissionStatus.granted) {
requestPermission(PermissionGroup.contacts);
} else {
loadContacts();
}
}
本文的目的是总结精心编写的官方文档:https://www.dartlang.org/tutorials/language/futures
我建议你也观看以下教程
我尽量让这篇文章尽可能简洁。我没有谈到的一件事是如何在使用Future对象时处理错误。如果您使用Future API(“then”关键字),您将能够使用catchError()
函数捕获错误,否则如果您使用“await”关键字,只需使用try-catch块来处理错误。
谢谢阅读 :)
转:https://medium.com/@meysam.mahfouzi/understanding-future-in-dart-3c3eea5a22fb