routeTo method
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,
));
}
}