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.
This commit is contained in:
parent
02535f50c1
commit
290ed842b2
@ -2,8 +2,6 @@
|
|||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
import 'dart:async';
|
|
||||||
|
|
||||||
import 'package:sky/animation.dart';
|
import 'package:sky/animation.dart';
|
||||||
import 'package:sky/material.dart';
|
import 'package:sky/material.dart';
|
||||||
import 'package:sky/src/widgets/animated_container.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/basic.dart';
|
||||||
import 'package:sky/src/widgets/gesture_detector.dart';
|
import 'package:sky/src/widgets/gesture_detector.dart';
|
||||||
import 'package:sky/src/widgets/navigator.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/theme.dart';
|
||||||
import 'package:sky/src/widgets/transitions.dart';
|
import 'package:sky/src/widgets/transitions.dart';
|
||||||
import 'package:sky/src/widgets/focus.dart';
|
import 'package:sky/src/widgets/focus.dart';
|
||||||
|
@ -129,8 +129,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);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@ -162,14 +167,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;
|
||||||
@ -245,8 +255,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()';
|
||||||
|
Loading…
x
Reference in New Issue
Block a user