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のように扱うこともできる。

Software engineer

Software engineer