Commit 290ed842 authored by Hixie's avatar Hixie

Handle a route being dismissed before being popped

Ensure that if a route's performance is dismissed before the route is
popped, that we pop the route.
parent 02535f50
......@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'package:sky/animation.dart';
import 'package:sky/material.dart';
import 'package:sky/src/widgets/animated_container.dart';
......@@ -11,7 +9,6 @@ import 'package:sky/src/widgets/framework.dart';
import 'package:sky/src/widgets/basic.dart';
import 'package:sky/src/widgets/gesture_detector.dart';
import 'package:sky/src/widgets/navigator.dart';
import 'package:sky/src/widgets/scrollable.dart';
import 'package:sky/src/widgets/theme.dart';
import 'package:sky/src/widgets/transitions.dart';
import 'package:sky/src/widgets/focus.dart';
......
......@@ -129,8 +129,13 @@ class NavigatorState extends State<Navigator> {
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);
});
};
......@@ -162,14 +167,19 @@ abstract class Route {
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;
......@@ -245,8 +255,8 @@ abstract class Route {
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()';
......
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