systemPop method

Future<void> systemPop({
  1. Map<String, String> pathParameters = const {},
  2. Map<String, String> queryParameters = const {},
  3. String? hash,
  4. Map<String, String> newHistoryState = const {},
})

Starts a systemPop cycle

systemPop cycle:

  1. onSystemPop (or onPop if not implemented) is called in all VNavigationGuards
  2. onSystemPop (or onPop if not implemented) is called in the nested-most VRouteElement of the current route
  3. 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,
    ),
  );
}