generate method
The core route generation logic for the browser.
This function is intended to be used as the onGenerateRoute for your
root app widget (e.g., MaterialApp).
It parses route settings, extracts path and arguments, validates them
against the routes list, and creates the appropriate PageRoute
(e.g., BrowserPageRoute, BrowserPopupRoute) based on the
provided TraceRoute.
Implementation
Route<dynamic> generate(RouteSettings settings) {
debugPrint('Browser.generate: Called with settings: ${settings.name}');
onNavigation?.call(settings);
final uri = Uri.tryParse(settings.name ?? '');
final name = uri?.path;
final deepLinkParameter = uri?.queryParameters;
final traceParameter = settings.arguments as Map?;
final traceRoute = adaptiveTrace?.call(name) ??
traceParameter?.getAndClean<TraceRoute>() ??
PageTraceRoute();
debugPrint('Browser.generate: traceRoute: $traceRoute');
final arguments = Map.from({
if (traceParameter != null) ...traceParameter,
if (deepLinkParameter != null)
DeepLinkParam: DeepLinkParam(deepLinkParameter),
});
debugPrint('Browser.generate: arguments: $arguments');
final appRoute = _obtainMainRoute(name, arguments);
debugPrint('Browser.generate: appRoute: ${appRoute.path}');
final browserRouteWithCustomTransition =
_browserRouteTransition(traceRoute, appRoute);
debugPrint(
'Browser.generate: browserRouteWithCustomTransition: ${browserRouteWithCustomTransition.path}',
);
final newSettings = RouteSettings(
name: name,
arguments: arguments,
);
final route = switch (traceRoute) {
PageTraceRoute() => BrowserPageRoute(
traceRoute: traceRoute,
appRoute: browserRouteWithCustomTransition,
settings: newSettings,
),
SwipeTraceRoute() => BrowserSwipePopupRoute(
traceRoute: traceRoute,
appRoute: browserRouteWithCustomTransition,
settings: newSettings,
),
PopupTraceRoute() => BrowserPopupRoute(
traceRoute: traceRoute,
appRoute: browserRouteWithCustomTransition,
settings: newSettings,
),
OverlayTraceRoute() => BrowserPageRoute(
appRoute: browserRouteWithCustomTransition,
traceRoute: PageTraceRoute(),
settings: newSettings,
),
};
debugPrint('Browser.generate: Returning route: $route');
return route;
}