Quando usarlo
Una nuova schermata raggiungibile dall'app, con un proprio stato: un elenco, un dettaglio, un form.
Regole da rispettare
- Feature-first: la schermata vive in
lib/features/<feature>/presentation, i provider inapplication, i contratti indomain, le implementazioni indata. I widget non chiamano mai Supabase direttamente. - Le route si dichiarano una sola volta nell'enum
AppRoutee si aprono per nome. Ilredirectdel router gestisce già sessione, onboarding e deep link: non aggiungere una seconda guardia dentro la pagina. - Una guardia del router è una comodità, non un'autorizzazione: i dati protetti sono garantiti dalla RLS.
- Lo stato vive in provider Riverpod, non in singleton o variabili globali. Caricamento, stato vuoto ed errore sono espliciti.
- Ogni testo visibile passa da
lib/l10n/*.arb, in tutti e tre i file.
Passi
- Aggiungi la route ad
AppRouteinlib/app/router/app_routes.dart, per esempionotes(path: '/notes'). Usa percorsi interni (/...):internalLocationscarta tutto il resto che arriva da un deep link. - Registra un
GoRouteinlib/app/router/app_router.dartconpath: AppRoute.notes.pathename: AppRoute.notes.name. Non aggiungerla a_gates, che contiene solo sessione, auth e onboarding: fuori dai gate il redirect protegge la route e, dopo l'accesso, ci riporta l'utente con il parametrofrom. - Crea lo stato in
lib/features/notes/application/notes_providers.dart. Leggi i dati con unFutureProvider, o unAsyncNotifierProviderse la schermata li modifica anche, che attendeauthSessionProvidercome facurrentProfileProvider. Prendi il repository dal suo provider, così i test possono sostituirlo. - Crea
lib/features/notes/presentation/notes_page.dartcomeConsumerWidget, sul modello diSettingsPage:AppBarconAppBackButton, contenuto limitato a 560 px eref.watch(notesProvider).when(...)per caricamento, errore e dati, più uno stato vuoto. Usa unConsumerStatefulWidgetsolo per lo stato locale della UI, come un controller di testo. - Aggiungi i testi ad
app_en.arb(il file di riferimento),app_de.arbeapp_it.arb.fvm flutter pub getrigeneracontext.l10n. - Aggiungi il punto di accesso, per esempio un pulsante in
HomePageche chiamacontext.pushNamed(AppRoute.notes.name). - Aggiungi un widget test che sostituisce il repository con un fake in un
ProviderScope, come fatest/critical_user_journey_test.dart. Apre la schermata e verifica caricamento, stato vuoto, dati ed errore, senza rete.
Completato quando
- i comandi di verifica passano;
- la schermata si apre dall'app e da un deep link dopo l'accesso;
- il test copre caricamento, stato vuoto, dati ed errore senza rete;
- i nuovi widget non contengono testi scritti nel codice.
