首先我们来看一下这块代码
Future.delayed(Duration.zero, () {
...
});
Future.delayed是指将任务延迟进行,但是dart语言本身是一个单线程模型,主线程中只依靠Event Queue和Microtask Queue来进行事件处理,所以flutter是没有时间调度的概念的,比如如果我要一个时间两秒后执行,那么不一定会在两秒后执行,具体只有在这个延迟事件两秒的时候可以到任务队列最前面而且前面没有正在执行的微任务或者其他事件,他才会在规定的事件执行。
我们先来看一张关于flutter任务队列的图
这张图明确说明了微任务队列的目的就是在当前事件处理完之后下个事件开始之前可以执行一些其他事务,所以微任务本身是比event有更高的优先级,在每一个事件开始执行之前就会完成所有的微任务。
这里再回到开始那行代码,我们点开delayed查看
- If the duration is 0 or less,
- it completes no sooner than in the next event-loop iteration,
- after all microtasks have run.
这是对delayed的一行解释,主要意思是如果延迟时间小于等于0,那么就会在这个事件会在下个事件开始之前运行,也就是在下个事件对应的微任务全部执行完毕再来运行当前这个事件。
理解这些之后就可以知道这个代码是如何运行的了,因为flutter的delayed不能像android那样可以插队运行,但是可以利用微任务队列来执行一些延迟比较低不过需要保证顺序或者延迟操作的任务而且不会延迟到下个任务之后。