High-Level-Routing

Ziel und Einordnung #

  • [Rollen] Expo Router übernimmt das dateibasierte Routing unter app/. Der zentrale Context‐Controller wird über Routenänderungen informiert und kann Logik wie Tracking, Guards oder modulare Zustandswechsel auslösen.
  • [Abgrenzung] Dieser Abschnitt beschreibt, wie das Frontend auf URL‑Änderungen hört und wie Navigation angestoßen wird. Die interne Context‑Routing‑Logik wird nur kurz gestreift; Details folgen in einem eigenen Kapitel zur Context‑Library.

Routenstruktur (Expo Router) #

  • [Dateibasiert] Jede Datei/Ordner in app/ entspricht einer Route. Beispiele:
    • app/index.tsx → /
    • app/auth/index.tsx → /auth
    • app/auth/(hideTabs)/privacy.tsx → /auth/privacy
  • [Layouts] Dateien wie app/auth/_layout.tsx definieren gemeinsame Header/Stack/Tabs für einen Bereich.

Auf URL hören (Frontend) #

  • [Mechanik] Mit usePathname() (Expo Router) wird der aktuelle Pfad gelesen. Ein useEffect meldet Änderungen an den Context‐Controller, damit zentrale Logik (z. B. Analytics, Feature‑Gates, Modulwechsel) greift.
  • [Beispiel] In app/auth/_layout.tsx:
// app/auth/_layout.tsx (Kurz)
import { useContextControllerProvider } from "@/providers/ContextControllerProvider";
import { usePathname, SplashScreen, Stack } from "expo-router";
import { useEffect } from "react";

export default function AuthLayout() {
  const context = useContextControllerProvider();
  const pathname = usePathname();

  useEffect(() => {
    context.handleRouteChange(pathname);
  }, [pathname]);

  SplashScreen.hideAsync(); // sobald bereit
  return <Stack /* Header-Optionen */ />;
}
  • [Wirkung] Der Controller erhält den neuen Pfad und kann intern den RouteController/Module anstoßen, ohne dass Screens selbst die Orchestrierung übernehmen.

Navigation aus der UI auslösen #

  • [Direkt über Expo Router] Für einfache Navigationsfälle:
import { router } from "expo-router";
// ...
router.push("/auth/privacy");       // neue Route pushen
// router.replace("/auth");         // aktuellen Screen ersetzen
  • [Bevorzugt über den Context‑Controller] Einheitliche Navigation (Guards, Logging, zentrale Regeln):
const { routeController } = useContextControllerProvider();
// Beispiel: symbolische Zielroute + Params
routeController.navigateToNext("[examination]", { examinationId: 123 }, [], false);
  • [Empfehlung] UI‑Komponenten sollten nach Möglichkeit über den Controller navigieren, damit zentrale Regeln und Seiteneffekte konsistent angewendet werden.

Typische Anwendungsfälle #

  • [Auth‑Fluss] Nach erfolgreichem Login triggert der Controller Navigation (z. B. zum Home‑Bereich). Die UI muss nur „Login geklickt“ melden.
  • [Detail‑Navigation] Aus einer Liste heraus wird per Controller zur Detailroute navigiert, mit Parametern (IDs), die der Controller validiert/aufbereitet.
  • [Externe Einflüsse] Wenn sich die URL ändert (Deep‑Link, Zurück‑Button), aktualisiert der Controller die modulare App‑Sicht, und die UI rendert reaktiv gemäß Store‑Zuständen.

Fehler‑ und Ladekontrolle #

  • [Gating] Der ContextControllerProvider rendert Kinder erst, wenn loaded gesetzt ist (siehe providers/ContextControllerProvider.tsx). So greifen Routen erst, wenn alle Module/Stores bereit sind.
  • [Robustheit] Navigation über den Controller kann zentral prüfen, ob Zielrouten verfügbar sind (Rollen, Datenvoraussetzungen), und passende Fallbacks wählen.

Zusammenfassung #

  • Expo Router definiert die Routenstruktur über app/.
  • Das Frontend hört mit usePathname() und useEffect auf Pfadänderungen und informiert den Context‐Controller.
  • Navigation kann direkt per router.push(…) oder – bevorzugt – über den routeController erfolgen, um zentrale Logik (Guards, Tracking, Regeln) konsistent zu halten.
  • Das Resultat ist ein schlankes UI, das Routen signalisiert und Navigationsintentionen auslöst, während der Controller die Orchestrierung übernimmt.

What are your feelings

Updated on Oktober 8, 2025