Commit 48142d68 authored by Ian Hickson's avatar Ian Hickson

Merge pull request #1490 from Hixie/navigator-ensure-pop

Handle a route being dismissed before being popped
parents 4913c4fc 290ed842
...@@ -136,8 +136,13 @@ class NavigatorState extends State<Navigator> { ...@@ -136,8 +136,13 @@ class NavigatorState extends State<Navigator> {
direction: (i <= _currentPosition) ? AnimationDirection.forward : AnimationDirection.reverse direction: (i <= _currentPosition) ? AnimationDirection.forward : AnimationDirection.reverse
); );
route._onDismissed = () { route._onDismissed = () {
assert(_history.contains(route));
if (_history.lastIndexOf(route) <= _currentPosition)
popRoute(route);
};
route._onRemoveRoute = () {
assert(_history.contains(route));
setState(() { setState(() {
assert(_history.contains(route));
_history.remove(route); _history.remove(route);
}); });
}; };
...@@ -170,14 +175,19 @@ abstract class Route { ...@@ -170,14 +175,19 @@ abstract class Route {
PerformanceView get performance => _performance?.view; PerformanceView get performance => _performance?.view;
Performance _performance; Performance _performance;
NotificationCallback _onDismissed; NotificationCallback _onDismissed;
NotificationCallback _onRemoveRoute;
Performance createPerformance() { Performance createPerformance() {
Duration duration = transitionDuration; Duration duration = transitionDuration;
if (duration > Duration.ZERO) { if (duration > Duration.ZERO) {
return new Performance(duration: duration) return new Performance(duration: duration)
..addStatusListener((PerformanceStatus status) { ..addStatusListener((PerformanceStatus status) {
if (status == PerformanceStatus.dismissed && _onDismissed != null) if (status == PerformanceStatus.dismissed) {
_onDismissed(); if (_onDismissed != null)
_onDismissed();
if (_onRemoveRoute != null)
_onRemoveRoute();
}
}); });
} }
return null; return null;
...@@ -253,8 +263,8 @@ abstract class Route { ...@@ -253,8 +263,8 @@ abstract class Route {
Widget build(NavigatorState navigator, PerformanceView nextRoutePerformance); Widget build(NavigatorState navigator, PerformanceView nextRoutePerformance);
void didPop([dynamic result]) { void didPop([dynamic result]) {
if (performance == null && _onDismissed != null) if (performance == null && _onRemoveRoute != null)
_onDismissed(); _onRemoveRoute();
} }
String toString() => '$runtimeType()'; String toString() => '$runtimeType()';
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment