Dart | Future的理解与快速使用

523 阅读2分钟

image.png 开启掘金成长之旅!这是我参与「掘金日新计划 · 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的使用。