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:
ContextControlleraus dem Paketcontext - 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
loadedprü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.