flutter 哪些任务是在微队列,哪些是在事件队列

Flutter 异步机制:微任务队列 vs 事件队列

在 Dart/Flutter 的事件循环(Event Loop)中,任务队列分为两个优先级:微任务队列(Microtask Queue)事件队列(Event Queue)

核心原则是:微任务队列优先级 > 事件队列 。 每次执行完一段同步代码后,Dart 会先清空微任务队列中的所有 任务,然后再去事件队列取一个任务执行。

以下是具体的分类:

1. 微任务队列 (Microtask Queue)

这里面的任务非常"急",通常用于内部状态的更新,或者希望在下一次 UI 渲染或 IO 操作前立即执行的代码。

  • scheduleMicrotask(): dart:async 库中直接调度微任务的方法。
  • Future.microtask(): 创建一个旨在微任务中运行的 Future。
  • Future.then() / .catchError() / .whenComplete() 的回调:
    • 当一个 Future 完成(complete)时,它的后续回调方法会被加入微任务队列。
    • 注意 :如果是 Future.value() 这种立即完成的 Future,它的 .then 也会立刻进入微任务队列。
  • async/await 的恢复执行:
    • await 等待的 Future 完成后,async 函数体内的后续代码(恢复执行部分)实际上被视为微任务调度。

2. 事件队列 (Event Queue)

这里主要包含外部事件、I/O 和定时器,是大部分异步任务发生的地方。

  • I/O 事件: 文件读写完成、网络请求返回数据等。
  • 定时器 : Future.delayed()Timer.run()Timer.periodic()
    • 注意Future.delayed 即使延时为 0,也是进入事件队列,因此它肯定比微任务晚执行。
  • Future() 构造函数 :
    • 例如 Future(() { ... }),这种普通的构造函数会将任务放入事件队列。
  • UI / 手势事件: 点击、滑动、键盘输入等(由 Engine 层传递给 Framework)。
  • 绘制指令: VSync 信号到来时触发的绘制任务。
  • Isolate 消息 : 其他 Isolate 发送到 ReceivePort 的消息。

简单对比总结

任务来源 队列归属 优先级
scheduleMicrotask(...) Microtask 高 (插队执行)
Future.microtask(...) Microtask
Future.then(...) Microtask
Future.value(...).then Microtask
Timer.run(...) Event 低 (排队执行)
Future.delayed(...) Event
Future(() => ...) Event
点击、IO、网络 Event

避坑指南

⚠️ 风险提示 :如果在微任务队列中无限循环添加微任务(例如递归调用 scheduleMicrotask),那么事件队列永远没有机会执行。 会导致:

  1. App 界面卡死(因为 UI 绘制事件在事件队列)。
  2. 点击无反应(手势事件在事件队列)。
  3. 网络请求不回调(IO 事件在事件队列)。

代码示例

dart 复制代码
import 'dart:async'; // 必须导入这个库

void main() {
  print('1. 同步代码开始');

  // 事件队列
  Future(() => print('6. Future() 去事件队列'));
  Future.delayed(Duration.zero, () => print('7. Future.delayed 去事件队列'));

  // 微任务队列
  scheduleMicrotask(() => print('3. scheduleMicrotask 去微任务队列'));
  Future.microtask(() => print('4. Future.microtask 去微任务队列'));
  
  // Future.value 是立即完成,.then 进入微任务
  Future.value().then((_) => print('5. Future.value().then 去微任务队列'));

  print('2. 同步代码结束');
}

打印结果:

相关推荐
IntMainJhy10 分钟前
【futter for open harmony】Flutter 鸿蒙聊天应用实战:shared_preferences 本地键值存储适配指南[特殊字符]
flutter·华为·harmonyos
IntMainJhy21 分钟前
【Flutter for OpenHarmony 】第三方库鸿蒙电商实战|首页模块完整实现[特殊字符]
flutter·华为·harmonyos
梦想不只是梦与想34 分钟前
flutter 与原生通信的底层原理(二)
flutter
Lanren的编程日记1 小时前
Flutter 鸿蒙应用离线模式实战:无网络也能流畅使用
网络·flutter·harmonyos
IntMainJhy2 小时前
【Flutter for OpenHarmony 】第三方库 聊天应用:Provider 状态管理实战指南
flutter·华为·harmonyos
IntMainJhy2 小时前
【futter for open harmony】Flutter 聊天应用实战:Material Design 3 全局 UI 规范落地指南✨
flutter·华为·harmonyos
IntMainJhy2 小时前
【flutter for open harmony】Flutter 聊天应用实战:go_router 路由管理完全实现指南
flutter·华为·harmonyos
liulian09162 小时前
【Flutter For OpenHarmony第三方库】Flutter 页面导航的鸿蒙化适配实战
flutter·华为·学习方法·harmonyos
Lanren的编程日记3 小时前
Flutter 鸿蒙应用用户反馈功能实战:快速收集用户意见与建议
flutter·华为·harmonyos
程序员老刘18 小时前
跨平台开发地图:四月风暴前夕,你该怎么选?| 2026年4月
flutter·ai编程·客户端