Wann du es brauchst
Ein neuer Screen, der aus der App erreichbar ist und eigenen State hat: eine Liste, eine Detailseite, ein Formular.
Regeln
- Feature-first: Der Screen liegt in
lib/features/<feature>/presentation, Provider inapplication, Verträge indomain, Implementierungen indata. Widgets rufen Supabase nie direkt auf. - Routen werden einmal im Enum
AppRoutedeklariert und per Name geöffnet. Derredirectdes Routers behandelt Sitzung, Onboarding und Deep Links bereits: Füge in der Seite keinen zweiten Guard hinzu. - Ein Router-Guard ist Komfort, keine Autorisierung: Geschützte Daten sichert RLS.
- State liegt in Riverpod-Providern, nicht in Singletons oder globalen Variablen. Lade-, Leer- und Fehlerzustand sind explizit.
- Jeder sichtbare Text läuft über
lib/l10n/*.arb, in allen drei Dateien.
Schritte
- Füge die Route zu
AppRouteinlib/app/router/app_routes.darthinzu, zum Beispielnotes(path: '/notes'). Halte Pfade intern (/...):internalLocationverwirft alles andere, was aus einem Deep Link kommt. - Registriere eine
GoRouteinlib/app/router/app_router.dartmitpath: AppRoute.notes.pathundname: AppRoute.notes.name. Füge sie nicht zu_gateshinzu, das nur Sitzung, Auth und Onboarding enthält: Außerhalb der Gates schützt der Redirect die Route und führt nach der Anmeldung über den Parameterfromzu ihr zurück. - Lege den State in
lib/features/notes/application/notes_providers.dartan. Lies Daten mit einemFutureProvider, oder einemAsyncNotifierProvider, wenn der Screen sie auch ändert, der wiecurrentProfileProvideraufauthSessionProviderwartet. Hole das Repository aus einem eigenen Provider, damit Tests es ersetzen können. - Lege
lib/features/notes/presentation/notes_page.dartalsConsumerWidgetnach dem Vorbild vonSettingsPagean:AppBarmitAppBackButton, Inhalt auf 560 px begrenzt undref.watch(notesProvider).when(...)für Laden, Fehler und Daten, dazu ein Leerzustand. Nutze einConsumerStatefulWidgetnur für lokalen UI-State wie einen Text-Controller. - Füge die Texte zu
app_en.arb(der Vorlagendatei),app_de.arbundapp_it.arbhinzu.fvm flutter pub geterzeugtcontext.l10nneu. - Füge den Einstieg hinzu, zum Beispiel einen Button in
HomePage, dercontext.pushNamed(AppRoute.notes.name)aufruft. - Füge einen Widget-Test hinzu, der das Repository in einem
ProviderScopedurch ein Fake ersetzt, wie intest/critical_user_journey_test.dart. Er öffnet den Screen und prüft Lade-, Leer-, Daten- und Fehlerzustand ohne Netzwerk.
Fertig, wenn
- die Prüfbefehle erfolgreich sind;
- sich der Screen aus der App und nach der Anmeldung per Deep Link öffnet;
- der Test Lade-, Leer-, Daten- und Fehlerzustand ohne Netzwerk abdeckt;
- die neuen Widgets keinen fest codierten Text enthalten.
