void _handleFlightEnded(_HeroFlight flight) { this._flights.Remove(flight.manifest.tag); }
void _startHeroTransition( PageRoute from, PageRoute to, Animation <float> animation, HeroFlightDirection flightType, bool isUserGestureTransition ) { if (navigator == null || from.subtreeContext == null || to.subtreeContext == null) { to.offstage = false; // in case we set this in _maybeStartHeroTransition return; } Rect navigatorRect = HeroUtils._boundingBoxFor(navigator.context);//_globalBoundingBoxFor(navigator.context); Dictionary <object, _HeroState> fromHeroes = Hero._allHeroesFor(from.subtreeContext, isUserGestureTransition, navigator); Dictionary <object, _HeroState> toHeroes = Hero._allHeroesFor(to.subtreeContext, isUserGestureTransition, navigator); to.offstage = false; foreach (object tag in fromHeroes.Keys) { if (toHeroes.ContainsKey(tag)) { HeroFlightShuttleBuilder fromShuttleBuilder = fromHeroes[tag].widget.flightShuttleBuilder; HeroFlightShuttleBuilder toShuttleBuilder = toHeroes[tag].widget.flightShuttleBuilder; bool isDiverted = _flights.ContainsKey(tag); _HeroFlightManifest manifest = new _HeroFlightManifest( type: flightType, overlay: navigator.overlay, navigatorRect: navigatorRect, fromRoute: from, toRoute: to, fromHero: fromHeroes[tag], toHero: toHeroes[tag], createRectTween: createRectTween, shuttleBuilder: toShuttleBuilder ?? fromShuttleBuilder ?? _defaultHeroFlightShuttleBuilder, isUserGestureTransition: isUserGestureTransition, isDiverted: isDiverted ); //if (_flights.TryGetValue(tag, out var result)) { if (isDiverted) { _flights[tag].divert(manifest); } else { _flights[tag] = new _HeroFlight(_handleFlightEnded); _flights[tag].start(manifest); } } else if (_flights.TryGetValue(tag, out var result)) { result.abort(); } } foreach (object tag in toHeroes.Keys) { _HeroState heroState = null; if (!fromHeroes.TryGetValue(tag, out heroState)) { toHeroes[tag].ensurePlaceholderIsHidden(); } } }