Zentraler Provider

Der ContextControllerProvider ist der zentrale Einstiegspunkt, der eine stabile, einmalige Controller-Instanz erstellt, Navigation integriert, den App-Status gated und so eine saubere Trennung zwischen UI und Domänenlogik ermöglicht. Diese Struktur erleichtert Erweiterbarkeit, Testbarkeit und konsistente App-weite Verhaltensweisen.

Zweck #

  • Der ContextControllerProvider stellt eine einzige, gemeinsam genutzte Controller-Instanz bereit, die Module, Routen und Navigation orchestriert.
  • Routing, Modulkonfiguration und Statusverwaltung werden zentral initialisiert und allen Screens/Komponenten verfügbar gemacht.

Ort im Code #

  • Provider-Datei: providers/ContextControllerProvider.tsx
  • Controller-Quelle: ContextController aus dem Paket context
  • Konfigurationen: @configs/routeConfig (Routenbeschreibung), @configs/moduleConfig (Modulkonfiguration)

Funktionsweise #

  • Context-Erzeugung und Instanzhaltung per useRef:
if (!controllerRef.current) {
  controllerRef.current = new Controller(moduleConfig,     routeConfig, routerFunctions);
}
  • Router-Integration via Expo Router (useRouter()), als einfache Funktionssammlung injiziert:
const routerFunctions = {
  push: (path: any, params: any) => router.push(path, params),
  replace: (path: any, params: any) => router.replace(path, params),
};
  • Lade-Gating verhindert frühes Rendern ohne initialisierte Ressourcen:

if (!controller || !controller.loaded) {
  return <></>;
}
  • Bereitstellung der Instanz über den Context:
<ContextController.Provider value={controller}>
  {children}
</ContextController.Provider>

Verwendungsrichtlinie #

  • Zugriff in Komponenten/Seiten über den Hook:
const { modules, routeController, loaded } = useContextControllerProvider();
  • Vor sensiblen Zugriffen (Navigation, Stores) optional loaded prüfen.
  • Navigation möglichst über Controller/Helper (z. B. routeController.navigateToNext(...)), damit zentrale Logik greift.

Vorteile des Ansatzes #

  • Single Source of Truth: genau eine Controller-Instanz für die gesamte App.
  • Konsistente Navigation: einheitliche Routenwechsel-Logik über injizierte routerFunctions.
  • Klare Initialisierungsphase: kein Flickern/Fehler dank loaded-Gating.
  • Lose Kopplung: UI bleibt schlank; Domänenlogik und Navigation liegen zentral im Controller.

What are your feelings

Updated on Oktober 7, 2025