前言
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 提供的強大機制。