routeTo method

Future routeTo(
  1. UIRoute<RouteType> routeData, {
  2. bool? fullScreenDialog,
  3. bool? replace,
  4. bool? replacePrevious,
  5. bool? uniqueInStack,
  6. bool? forceGlobal,
  7. bool? needToEnsureClose,
  8. bool? dismissable,
  9. Object? id,
  10. NavigationRouteBuilder? customRouteBuilder,
  11. bool awaitRouteResult = false,
})

Opens new route

Implementation

Future<dynamic> routeTo(
  UIRoute<RouteType> routeData, {
  bool? fullScreenDialog,
  bool? replace,
  bool? replacePrevious,
  bool? uniqueInStack,
  bool? forceGlobal,
  bool? needToEnsureClose,
  bool? dismissable,
  Object? id,
  NavigationRouteBuilder? customRouteBuilder,
  bool awaitRouteResult = false,
}) async {
  final bool global = _checkGlobalNavigatorNeeded(
    forceGlobal ?? routeData.defaultSettings.global,
  );

  final routeSettings = UIRouteSettings(
    fullScreenDialog:
        fullScreenDialog ?? routeData.defaultSettings.fullScreenDialog,
    global: global,
    uniqueInStack: uniqueInStack ?? routeData.defaultSettings.uniqueInStack,
    needToEnsureClose:
        needToEnsureClose ?? routeData.defaultSettings.needToEnsureClose,
    dismissable: dismissable ?? routeData.defaultSettings.dismissable,
    id: id ?? routeData.defaultSettings.id,
    replace: replace ?? routeData.defaultSettings.replace,
    replacePrevious:
        replacePrevious ?? routeData.defaultSettings.replacePrevious,
    name: routeData.name.toString(),
    customRouteBuilder:
        customRouteBuilder ?? routeData.defaultSettings.customRouteBuilder,
  );

  final routeName = routeData.name;

  // Firstly check if element is already in stack
  // if it is and uniqueInStack flag is set to true we just return immediately
  if (routeSettings.uniqueInStack &&
      !navigationStack.checkUnique(
        routeName: routeName,
        tab: currentTab,
        global: global,
      ) &&
      !routeSettings.replace) {
    return;
  }

  final navigator = getNavigator(forceGlobal: global);

  final screenToOpen = routeData.child;

  final routeBuilder =
      routeSettings.customRouteBuilder ?? settings.routeBuilder;

  // coverage:ignore-start
  final route = routeBuilder.buildPageRoute(
    child: screenToOpen,
    fullScreenDialog: routeSettings.fullScreenDialog,
    onSystemPop: routeSettings.replace
        ? null
        : () {
            pop(onlyInternalStack: true);
          },
  );
  // coverage:ignore-end

  if (routeSettings.replace) {
    // if replace flag is provided we clear stack and navigator state
    navigationStack
      ..clearTabNavigationStack()
      ..replaceStack(
        routeName: routeName,
        settings: routeSettings,
      );

    unawaited(onRouteOpened(screenToOpen, routeSettings));

    // coverage:ignore-start
    unawaited(navigator.currentState?.pushAndRemoveUntil(
      route,
      (route) => false,
    ));
    // coverage:ignore-end
  } else if (routeSettings.replacePrevious) {
    // if replace flag is provided we clear stack and navigator state
    navigationStack.replaceLastRoute(
      routeName: routeName,
      tab: currentTab,
      settings: routeSettings,
    );

    unawaited(onRouteOpened(screenToOpen, routeSettings));

    return await navigator.currentState?.pushReplacement(route);
  } else {
    // otherwise we just add route and push it to navigator

    navigationStack.addRoute(
      routeName: routeName,
      tab: currentTab,
      settings: routeSettings,
    );

    unawaited(onRouteOpened(screenToOpen, routeSettings));

    if (awaitRouteResult) {
      return await navigator.currentState?.push(
        route,
      );
    }

    unawaited(navigator.currentState?.push(
      route,
    ));
  }
}