Flutter学习-20- 异步函数

255 阅读2分钟

「这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战」。

  • 在dart中是单线程,但是可以是异步函数

1. 异步函数

void main() {
  test();
  print('做其他事');
}
String _string = '0';
test() async{

  print('开始请求数据string:$_string');

  for (int i = 0;i<1000000000;i++){

    _string = '网络数据';

  }

  print('请求结束:string:$_string');

}

我们使用async修饰函数,耗时操作异步

image.png

但是结果还是同步的,没没有我们想要的异步效果,我们去除async也是一样的

image.png

我们想要异步操作的话,就需要包裹一层future,之前的网络请求内部也是包裹了future。我们使用future进行包裹

test() async{

  print('开始请求数据string:$_string');

 Future((){
   for (int i = 0;i<1000000000;i++){

     _string = '网络数据';

   }

   print('请求结束:string:$_string');
 });

}

image.png

相当于我们把异步的操作包装到了future里面去了,future函数就相当于一个任务。 我们把异步去掉,future的闭包就相当于一个异步函数。

image.png

2. Dart的异步-Future

Future() 相当于一个对象,()里面的任务放到异步任务里面了,里面的任务执行完成后会返回数据。

image.png

我们希望异步执行完成后拿到数据,进行打印。这个时候需要使用await,相当于等待Future完成后执行后面的操作。

image.png

await使用注意的:

  1. awiat后面的操作必须是异步才能使用await修饰
  2. 当前这个函数也必须是异步函数

image.png

我们在Future异步函数之后,还想做点任务,这个时候使用await就会造成了同步的效果。
Futuer 本身是一个构造函数会返回Future的对象,我们使用.then 表示Future 任务执行完成后进行的回调函数

image.png

Future 是个工厂构造函数,返回_futuer,通过timer加入异步任务队列,完成后会调用complete。

image.png

.then里面的value 相当于future任务的返回值。

image.png

我么给个返回值,在for循环执行完毕后

image.png

then的定义

image.png

value是一个范型,相当于block代码块返回值。then本身还有一个返回值,Future<R> 这样做为了我们可以使用链式语法。

image.png