diff --git a/lib/container/boost_container.dart b/lib/container/boost_container.dart index 7c3da674bc2accb0229daa4f08d43b4e628a02bb..a971158da5380f067c58adb5ed219fba0f3807b4 100755 --- a/lib/container/boost_container.dart +++ b/lib/container/boost_container.dart @@ -132,6 +132,8 @@ class BoostContainerState extends NavigatorState { @override BoostContainer get widget => super.widget as BoostContainer; + final List<Route<dynamic>> routerHistory = <Route<dynamic>>[]; + ContainerNavigatorObserver findContainerNavigatorObserver( Navigator navigator) { for (NavigatorObserver observer in navigator.observers) { @@ -146,7 +148,7 @@ class BoostContainerState extends NavigatorState { @override void initState() { super.initState(); - backPressedHandler = ()=>pop(); + backPressedHandler = () => maybePop(); } @override @@ -160,6 +162,7 @@ class BoostContainerState extends NavigatorState { void dispose() { findContainerNavigatorObserver(widget)?.removeBoostNavigatorObserver( FlutterBoost.containerManager.navigatorObserver); + routerHistory.clear(); super.dispose(); } @@ -169,18 +172,43 @@ class BoostContainerState extends NavigatorState { backPressedHandler?.call(); } + @override + Future<bool> maybePop<T extends Object>([T result]) async { + final Route<T> route = routerHistory.last; + final RoutePopDisposition disposition = await route.willPop(); + if (mounted) { + switch (disposition) { + case RoutePopDisposition.pop: + pop(result); + return true; + break; + case RoutePopDisposition.doNotPop: + return false; + break; + case RoutePopDisposition.bubble: + pop(result); + return true; + break; + } + } + } + @override bool pop<T extends Object>([T result]) { + if (routerHistory.length > 1) { + routerHistory.removeLast(); + } + if (canPop()) { return super.pop(result); } else { - if (T is Map<String,dynamic>) { - FlutterBoost.singleton.close(uniqueId, result:result as Map<String,dynamic>); - }else{ + if (T is Map<String, dynamic>) { + FlutterBoost.singleton + .close(uniqueId, result: result as Map<String, dynamic>); + } else { FlutterBoost.singleton.close(uniqueId); } } - return false; } @@ -194,6 +222,8 @@ class BoostContainerState extends NavigatorState { Future<T> future = super.push<T>(newRoute ?? route); + routerHistory.add(route); + if (FlutterBoost.containerManager.postPushRoute != null) { FlutterBoost.containerManager .postPushRoute(name, uniqueId, params, newRoute ?? route, future);