class Future { // ... Future<R> then<R>( FutureOr<R> callback(T value), // ... ) { // Notify zone about callback for async operation callback = Zone.current.registerUnaryCallback(callback); final result = Future(); // Schedule to complete [result] when async operation ends _addListener(_FutureListener.then( result, callback, // ... )); return result; } } class _FutureListener { // ... FutureOr<T> handleValue(S value) => // Call scheduled work inside zone that was saved in [result] Future result._zone.runUnary(_callback, value); }