DartのZone入門
2 min readOct 14, 2018
Zoneはプログラム実行のコンテクストそのものであり、すべてのプログラムは何らかのZoneで実行される。(現在のZoneはZone.current で取得できる) Zoneは非同期呼び出しを扱いやすくするものでdart:asyncに含まれている。
2014年の公式のドキュメントによると、Zoneの主な用途は非同期に実行したコードのエラーハンドリングのようである。
例えば、以下のようにonError
を使用することで、Zoneごとのエラーハンドリングが可能である。 runZoned
は現在のZoneをforkしてきて、bodyの中の新しいZoneでプログラムを実行している。
※ 本記事のサンプルコードの動作はすべてDart VM verson: 2.0.0
で確認している。
また、Zoneごとにcallbackを設定することができる。ここではregisterCallback
を使用している。現在のZoneが切り替わるタイミングで設定していたcallbackが呼ばれている。実際にはcallbackで非同期に実行したプログラムのスタックトレースを保存するといった用途が考えられる。
上記以外にもZoneは多くことを実現できる。例えば、親のZoneの関数をoverrideしたり、親のZoneに委譲したりして、Classのように扱うこともできる。