AppRouter constructor

AppRouter({
  1. required Iterable<RouteNode> routes,
  2. AppContext? app,
  3. Uri? initialLocation,
  4. WidgetBuilder? loading,
  5. WidgetBuilder? notFound,
  6. RouterErrorBuilder? error,
  7. RouterInitialState? initialState,
})

Creates a router from manually assembled or generated routes.

Implementation

factory AppRouter({
  required Iterable<RouteNode> routes,
  AppContext? app,
  Uri? initialLocation,
  WidgetBuilder? loading,
  WidgetBuilder? notFound,
  RouterErrorBuilder? error,
  RouterInitialState? initialState,
}) {
  final routeList = List<RouteNode>.of(routes, growable: false);
  final localRouteIdentities = HashSet<Object>.identity();
  void collectLocalRoutes(Iterable<RouteNode> nodes) {
    for (final route in nodes) {
      if (route is PageRoute || route is ShellRoute) {
        localRouteIdentities.add(route.identity);
      }
      collectLocalRoutes(route.children);
    }
  }

  late final Uri location;
  if (initialLocation case final initial?) {
    if (!initial.hasAbsolutePath) {
      throw ArgumentError.value(
        initial,
        'initialLocation',
        'Router locations must have an absolute path.',
      );
    }
    location = initial;
  } else if (initialState case final initial?) {
    location = initial.location;
  } else {
    final platform = Uri.parse(
      ui.PlatformDispatcher.instance.defaultRouteName,
    );
    location = platform.hasAbsolutePath ? platform : Uri(path: '/');
  }
  final context = app ?? AppContext.empty();
  final provider = _RouteInformationProvider(location);
  late final AppRouter router;
  final delegate = _RouterDelegate(
    matcher: RouteMatcher(routeList),
    provider: provider,
    router: () => router,
    app: context,
    loading: loading,
    notFound: notFound,
    error: error,
    initialState: initialState,
  );
  collectLocalRoutes(routeList);
  router = AppRouter._(
    provider: provider,
    delegate: delegate,
    app: context,
    ownsApp: app == null,
    localRouteIdentities: localRouteIdentities,
  );
  return router;
}