前言
Zone 是 Dart 异步模型中的核心机制,主要用于:
- 隔离异步上下文,形成逻辑上的执行环境。
- 捕获未处理的异步异常,保证系统稳定。
- 自定义异步任务的调度行为(比如微任务、Timer)。
- 什么是 Zone?
Zone 是 Dart 中每一个异步执行单元的上下文环境。
- 每个 Zone 可以拦截或修改异步相关行为。
- Zone 形成树状结构(rootZone → 子Zone → 孙Zone…)。
- 每次异步跳转(如 Future.then、Timer)都会绑定到当前 Zone。
- Zone 的核心功能
功能
说明
捕获未处理异常
handleUncaughtError 捕捉 Future/Timer/Stream 抛出的异常。
修改异步行为
可以重新定义微任务调度、定时器、打印等行为。
绑定异步回调
Future/Stream 自动记录当前 Zone,保证回调在正确 Zone 执行。
提供 Zone-local storage
每个 Zone 可携带私有数据。 - Zone 的重要API
3.1 创建新 Zone
Zone.current.fork(specification: ZoneSpecification(…));
创建一个新的子 Zone,可以定制微任务调度、异常处理等行为。
3.2 运行代码
Zone.run(() {…}); // 普通运行,异常不自动捕获
Zone.runGuarded(() {…}); // 自动捕获同步异常
3.3 绑定回调
Zone.bindCallback(callback);
Zone.bindUnaryCallback(callback);
Zone.bindBinaryCallback(callback);
把 Future/Timer 等的回调绑定到当前 Zone 环境。
- ZoneSpecification 定制能力
通过 ZoneSpecification,可以拦截和修改各种异步操作,包括:
4.1 scheduleMicrotask
void scheduleMicrotask(void Function() callback);
- 向微任务队列提交任务。
- Flutter 中大量 Future.microtask、scheduleMicrotask 都经过这里。
示例:
ZoneSpecification(scheduleMicrotask: (self, parent, zone, f) {print('Microtask scheduled');parent.scheduleMicrotask(zone.bindCallbackGuarded(f));},
);
4.2 createTimer
Timer createTimer(Duration duration, void Function() callback);
- 创建一次性定时器。
- 可拦截 Future.delayed、Timer.run 等操作。
示例:
ZoneSpecification(createTimer: (self, parent, zone, duration, f) {print('Timer scheduled for $duration');return parent.createTimer(zone, duration, zone.bindCallbackGuarded(f));},
);
4.3 createPeriodicTimer
Timer createPeriodicTimer(Duration period, void callback(Timer timer));
- 创建周期性定时器。
- 可拦截周期性轮询任务。
示例:
ZoneSpecification(createPeriodicTimer: (self, parent, zone, period, f) {print('Periodic Timer scheduled every $period');return parent.createPeriodicTimer(zone, period, (timer) {zone.runUnaryGuarded(f, timer);});},
);
4.4 handleUncaughtError
void handleUncaughtError(Zone self, ZoneDelegate parent, Zone zone, Object error, StackTrace stackTrace);
- 捕获未处理的 Future/Timer/Stream 异常。
示例:
ZoneSpecification(handleUncaughtError: (self, parent, zone, error, stackTrace) {print('Caught error: $error');},
);
- Flutter 中 Zone 的应用
Flutter 在启动时调用了:
runZonedGuarded(() async {runApp(MyApp());
}, (error, stack) {// 全局异常捕获
});
作用:
- 保护整个 Flutter App 的异步执行。
- 集中处理所有未捕获的异常。
- 确保 Future/Timer/IO等异步异常不会直接 crash 程序。
Flutter 的 SchedulerBinding、Timer、GestureBinding、异步渲染逻辑等内部,也大量依赖 Zone 调度微任务或定时任务。
- 总结
核心概念
说明
Zone
异步上下文执行环境。
ZoneSpecification
拦截并自定义微任务/定时器/异常处理等。
scheduleMicrotask
拦截微任务提交。
createTimer/createPeriodicTimer
拦截定时器任务。
handleUncaughtError
捕获未处理异常。
Zone 是 Dart 异步调度的核心支撑,Flutter 的稳定性也依赖 Zone 提供的强大机制。