void _updateSecondaryAnimation(Route nextRoute) { if (nextRoute is TransitionRoute && this.canTransitionTo((TransitionRoute) nextRoute) && ((TransitionRoute) nextRoute).canTransitionFrom(this)) { Animation<float> current = this._secondaryAnimation.parent; if (current != null) { if (current is TrainHoppingAnimation) { TrainHoppingAnimation newAnimation = null; newAnimation = new TrainHoppingAnimation( ((TrainHoppingAnimation) current).currentTrain, ((TransitionRoute) nextRoute)._animation, onSwitchedTrain: () => { D.assert(this._secondaryAnimation.parent == newAnimation); D.assert(newAnimation.currentTrain == ((TransitionRoute) nextRoute)._animation); this._secondaryAnimation.parent = newAnimation.currentTrain; newAnimation.dispose(); } ); this._secondaryAnimation.parent = newAnimation; ((TrainHoppingAnimation) current).dispose(); } else { this._secondaryAnimation.parent = new TrainHoppingAnimation(current, ((TransitionRoute) nextRoute)._animation); } } else { this._secondaryAnimation.parent = ((TransitionRoute) nextRoute)._animation; } } else { this._secondaryAnimation.parent = Animations.kAlwaysDismissedAnimation; } }
void _updateSecondaryAnimation(Route nextRoute) { VoidCallback previousTrainHoppingListenerRemover = _trainHoppingListenerRemover; _trainHoppingListenerRemover = null; if (nextRoute is TransitionRoute && canTransitionTo((TransitionRoute)nextRoute) && ((TransitionRoute)nextRoute).canTransitionFrom((TransitionRoute)this)) { Animation <float> current = _secondaryAnimation.parent; if (current != null) { Animation <float> currentTrain = current is TrainHoppingAnimation ? ((TrainHoppingAnimation)current).currentTrain : current; Animation <float> nextTrain = ((TransitionRoute)nextRoute)._animation; if ( currentTrain.value == nextTrain.value || nextTrain.status == AnimationStatus.completed || nextTrain.status == AnimationStatus.dismissed ) { _setSecondaryAnimation(nextTrain, ((TransitionRoute)nextRoute).completed); } else { TrainHoppingAnimation newAnimation = null; void _jumpOnAnimationEnd(AnimationStatus status) { switch (status) { case AnimationStatus.completed: case AnimationStatus.dismissed: _setSecondaryAnimation(nextTrain, ((TransitionRoute)nextRoute).completed); if (_trainHoppingListenerRemover != null) { _trainHoppingListenerRemover(); _trainHoppingListenerRemover = null; } break; case AnimationStatus.forward: case AnimationStatus.reverse: break; } } _trainHoppingListenerRemover = () => { nextTrain.removeStatusListener(_jumpOnAnimationEnd); newAnimation?.dispose(); }; nextTrain.addStatusListener(_jumpOnAnimationEnd); newAnimation = new TrainHoppingAnimation( currentTrain, nextTrain, onSwitchedTrain: () => { D.assert(_secondaryAnimation.parent == newAnimation); D.assert(newAnimation.currentTrain == ((TransitionRoute)nextRoute)._animation); _setSecondaryAnimation(newAnimation.currentTrain, ((TransitionRoute)nextRoute).completed); if (_trainHoppingListenerRemover != null) { _trainHoppingListenerRemover(); _trainHoppingListenerRemover = null; } } ); _setSecondaryAnimation(newAnimation, ((TransitionRoute)nextRoute).completed); } } else { _setSecondaryAnimation(((TransitionRoute)nextRoute)._animation, ((TransitionRoute)nextRoute).completed); } } else { _setSecondaryAnimation(Animations.kAlwaysDismissedAnimation); } if (previousTrainHoppingListenerRemover != null) { previousTrainHoppingListenerRemover(); } }