Flutter的异步回调
Posted 一杯清泉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter的异步回调相关的知识,希望对你有一定的参考价值。
一、Dart的事件循环
Dart的事件循环机制相当于android中的handler机制,Android中是多线程了,但是dart是单线程的,更像js中的事件循环机制,虽然是单线程的,但是dart也提供了异步的功能函数对象Future,类似于js的compose函数。Dart的事件有两个队列。一个是微任务队列。如下图:
- 事件队列:包含外部事件,例如I/O, Timer,绘制事件等等。
- 微任务队列:则包含有Dart内部的微任务,主要是通过scheduleMicrotask来调度。
两种队列的规则如下图:
执行规则如下:
- 首先处理所有微任务队列里的微任务。
- 处理完所有微任务以后,从事件队列里取1个事件进行处理。
- 回到微任务队列继续循环。
二、如何实现异步
那么在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的异步回调的主要内容,如果未能解决你的问题,请参考以下文章