create static method

GoRouter create({
  1. required List<RouteBase> routes,
  2. String initialLocation = '/',
  3. List<BloomGuard> globalGuards = const [],
  4. Widget errorBuilder(
    1. BuildContext,
    2. GoRouterState
    )?,
  5. List<NavigatorObserver>? observers,
  6. bool debugLogDiagnostics = false,
})

Creates and configures the GoRouter instance from route definitions and guards.

Parameters:

  • routes: List of route definitions (GoRoute, ShellRoute, etc.).
  • initialLocation: Starting URL path (defaults to '/').
  • globalGuards: Guards executed on every navigation event before route resolution.
  • errorBuilder: Custom 404/error page builder.
  • observers: Navigator observers (e.g. for analytics/telemetry).
  • debugLogDiagnostics: Enables verbose GoRouter debug logging.

Implementation

static GoRouter create({
  required List<RouteBase> routes,
  String initialLocation = '/',
  List<BloomGuard> globalGuards = const [],
  Widget Function(BuildContext, GoRouterState)? errorBuilder,
  List<NavigatorObserver>? observers,
  bool debugLogDiagnostics = false,
}) {
  _activeGoRouter = GoRouter(
    navigatorKey: rootNavigatorKey,
    initialLocation: initialLocation,
    routes: routes,
    observers: observers,
    debugLogDiagnostics: debugLogDiagnostics,
    errorBuilder: errorBuilder ?? _defaultErrorBuilder,
    redirect: (context, state) async {
      final match = BloomRouteMatch(
        location: state.uri.toString(),
        path: state.matchedLocation,
        pathParameters: state.pathParameters,
        queryParameters: state.uri.queryParameters,
        extra: state.extra,
      );

      // Run global guards
      for (final guard in globalGuards) {
        final result = await guard.canActivate(context, match);
        if (!result.isAllowed) {
          if (result.redirectPath != null) {
            logger.info('Redirecting to: ${result.redirectPath}');
            return result.redirectPath;
          }
          logger.warn('Access denied: ${result.denialMessage}');
          return '/';
        }
      }
      return null;
    },
  );

  // Drain any cold-start deep links that arrived before router creation
  WidgetsBinding.instance.addPostFrameCallback((_) {
    BloomDeepLinks.drainPending();
  });

  return _activeGoRouter!;
}