create static method
GoRouter
create({
- required List<
RouteBase> routes, - String initialLocation = '/',
- List<
BloomGuard> globalGuards = const [], - Widget errorBuilder()?,
- List<
NavigatorObserver> ? observers, - 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!;
}