internal void _addListener(_FutureListener listener) { D.assert(listener._nextListener == null); if (_mayAddListener) { listener._nextListener = (_FutureListener)_resultOrListeners; _resultOrListeners = listener; } else { if (_isChained) { // Delegate listeners to chained source future. // If the source is complete, instead copy its values and // drop the chaining. _Future source = _chainSource; if (!source._isComplete) { source._addListener(listener); return; } _cloneResult(source); } D.assert(_isComplete); // Handle late listeners asynchronously. _zone.scheduleMicrotask(() => { _propagateToListeners(this, listener); return(null); }); } }