systemPop method
Starts a systemPop cycle
systemPop cycle:
- onSystemPop (or onPop if not implemented) is called in all VNavigationGuards
- onSystemPop (or onPop if not implemented) is called in the nested-most VRouteElement of the current route
- onSystemPop (or onPop if not implemented) is called in VRouter
In any of the above steps, we can use a VRedirector if you want to redirect or stop the navigation
Implementation
Future<void> systemPop({
Map<String, String> pathParameters = const {},
Map<String, String> queryParameters = const {},
String? hash,
Map<String, String> newHistoryState = const {},
}) async {
// Try to pop a Nav1 page
bool hasNav1Pushed = false;
navigatorKey.currentState!.popUntil((route) {
if (!hasNav1Pushed && !(route.settings is Page)) {
hasNav1Pushed = true;
}
return true;
});
// If successful, warn the VWidgetGuards
if (hasNav1Pushed) {
// Check for nav1 pushed routes
final vRouterData = VRedirectorData(
historyState: historyState,
pathParameters: _vRoute.pathParameters,
queryParameters: this.queryParameters,
url: url,
previousUrl: previousUrl,
names: names,
);
final vRedirector = VRedirector(
fromUrl: url,
toUrl: url,
previousVRouterData: vRouterData,
newVRouterData: vRouterData,
vRouterDelegate: this,
);
// Get Nav1 VWidgetGuardMessagesRoot
final nav1VWidgetGuardMessagesRoot = _vWidgetGuardMessagesRoot.where(
(element) => element.associatedVRouteElement == _rootVRouter,
);
final nav1VWidgetGuardMessageRoot =
nav1VWidgetGuardMessagesRoot.length > 0
? nav1VWidgetGuardMessagesRoot.last
: null;
nav1VWidgetGuardMessageRoot?.vWidgetGuard.onSystemPop(vRedirector);
if (!vRedirector.shouldUpdate) {
return;
}
// If last nav1 route did not stop the popping, pop
_vWidgetGuardMessagesRoot.remove(nav1VWidgetGuardMessageRoot);
navigatorKey.currentState!.pop();
return;
}
_systemPop(
VPopData(
elementToPop: _vRoute.vRouteElementNode.getVRouteElementToSystemPop(),
pathParameters: pathParameters,
queryParameters: queryParameters,
hash: hash,
newHistoryState: newHistoryState,
),
);
}