generate method

Route generate(
  1. RouteSettings settings
)

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;
}