Flutter的异步回调

Posted 一杯清泉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter的异步回调相关的知识,希望对你有一定的参考价值。

一、Dart的事件循环

        Dart的事件循环机制相当于android中的handler机制,Android中是多线程了,但是dart是单线程的,更像js中的事件循环机制,虽然是单线程的,但是dart也提供了异步的功能函数对象Future,类似于js的compose函数。Dart的事件有两个队列。一个是微任务队列。如下图:

  • 事件队列:包含外部事件,例如I/O, Timer,绘制事件等等。
  • 微任务队列:则包含有Dart内部的微任务,主要是通过scheduleMicrotask来调度。

两种队列的规则如下图:

执行规则如下:

  1. 首先处理所有微任务队列里的微任务。
  2. 处理完所有微任务以后,从事件队列里取1个事件进行处理。
  3. 回到微任务队列继续循环。

二、如何实现异步

        那么在Dart中如何让你的代码异步执行呢?很简单,把要异步执行的代码放在微任务队列或者事件队列里就行了。

  • 可以调用Timer.run来让代码以Event的方式异步执行。
  • 可以调用scheduleMicrotask来让代码以微任务的方式异步执行。

        总结:对微任务队列是一次性全部处理,对于事件队列是一次只处理一个,首先处理的是所有的微任务,不管微任务有多少都优先处理,处理完毕在处理其他事件。

三、异步的实现Future

1、Future的获取

要使用Future的话需要引入dart.async,如下:

import 'dart:async' show Future;

2、Future的创建

  • 使用Future的接口创建同步
  • 使用async和await创建异步

下面会有详细说明 

3、Future的同步方法

(1)创建一个立刻在事件队列里运行的Future

Future(() => );

(2)创建一个延时1秒在事件队列里运行的Future

 Future.delayed(const Duration(seconds:1), () => )

(3)创建一个在微任务队列里运行的Future

Future.microtask(() => ) 

(4)创建一个同步运行的Future 

Future.sync(() => )

4、Future的异步方法

        dart的异步需要依靠async/await两个关键字,async和await的关系:

  • await只能在async函数中出现。
  • async函数中可以出现多个await,每遇见一个就返回一个Future, 实际结果类似于用then串起来的回调。
  • async函数也可以没有await, 在函数体同步执行完毕以后返回一个Future。

例如:

Future<String> loadAsset() async {
	return await rootBundle.loadString('assets/privacy-policy.html');
}

5、Future的回调

loadAsset().then((value) => {
  print('执行成功$value')
}).catchError((error){
  print('执行错误请求$error');
}).whenComplete((){
  print("全部执行结束...");
});
  • then:回调成功的内容,可以回调多次。
  • catchError:回调错误的内容。
  • whenComplete:正常执行完毕还是抛出异常都会执行。

 在日常使用场景中,我们通常利用async,await来异步处理IO,网络请求等耗时操作的任务。

参考文章:

  • https://blog.csdn.net/singwhatiwanna/article/details/99914206
  • https://www.jianshu.com/p/d03cc2e05693

以上是关于Flutter的异步回调的主要内容,如果未能解决你的问题,请参考以下文章

Flutter的异步回调

Flutter的异步回调

颤振/飞镖:如何在飞镖 FFI 中使用异步回调?

前端面试题之手写promise

NodeJs异步的执行过程

使用带有服务器回调的 http 进行 Flutter 飞镖测试