Flutter - 了解Flutter和Dart中的Future

2019-08-15  本文已影响0人  开心人开发世界

Future数据类型的概念很容易理解。虽然官方文档已经很好地解释了这个概念,但在本文中我将尝试用我自己的语言解释它,如果你还没有,那么希望能帮助你理解它。

当函数返回一个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的结果:

假设该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

上一篇 下一篇

猜你喜欢

热点阅读