Merge pull request #1490 from Hixie/navigator-ensure-pop
Handle a route being dismissed before being popped
diff --git a/packages/flutter/lib/src/widgets/navigator.dart b/packages/flutter/lib/src/widgets/navigator.dart
index f47c70a..d69d75a 100644
--- a/packages/flutter/lib/src/widgets/navigator.dart
+++ b/packages/flutter/lib/src/widgets/navigator.dart
@@ -136,8 +136,13 @@
direction: (i <= _currentPosition) ? AnimationDirection.forward : AnimationDirection.reverse
);
route._onDismissed = () {
+ assert(_history.contains(route));
+ if (_history.lastIndexOf(route) <= _currentPosition)
+ popRoute(route);
+ };
+ route._onRemoveRoute = () {
+ assert(_history.contains(route));
setState(() {
- assert(_history.contains(route));
_history.remove(route);
});
};
@@ -170,14 +175,19 @@
PerformanceView get performance => _performance?.view;
Performance _performance;
NotificationCallback _onDismissed;
+ NotificationCallback _onRemoveRoute;
Performance createPerformance() {
Duration duration = transitionDuration;
if (duration > Duration.ZERO) {
return new Performance(duration: duration)
..addStatusListener((PerformanceStatus status) {
- if (status == PerformanceStatus.dismissed && _onDismissed != null)
- _onDismissed();
+ if (status == PerformanceStatus.dismissed) {
+ if (_onDismissed != null)
+ _onDismissed();
+ if (_onRemoveRoute != null)
+ _onRemoveRoute();
+ }
});
}
return null;
@@ -253,8 +263,8 @@
Widget build(NavigatorState navigator, PerformanceView nextRoutePerformance);
void didPop([dynamic result]) {
- if (performance == null && _onDismissed != null)
- _onDismissed();
+ if (performance == null && _onRemoveRoute != null)
+ _onRemoveRoute();
}
String toString() => '$runtimeType()';