1. Injection du modèle avec ChangeNotifierProvider

Pour rendre notre modèle d’état accessible à l’ensemble des écrans, nous le positionnons tout en haut de l’arbre de widgets, généralement au niveau de la racine runApp() :

void main() {
    runApp(
        ChangeNotifierProvider(
            create: (context) => SessionUtilisateurModel(),
            child: const MonApplicationEcole(),
        ),
    );
}

2. Consommation ciblée avec le widget Consumer

Le widget Consumer<T> écoute les modifications du modèle et reconstruit uniquement la portion de widgets qui dépend des données modifiées, sans reconstruire tout l’écran :

Consumer<SessionUtilisateurModel>(
    builder: (context, session, child) {
        if (!session.estConnecte) {
            return const Text('Session non active : Veuillez vous connecter.');
        }
        return Text(
            'Bienvenue, ${session.nomUtilisateur} !',
            style: const TextStyle(fontWeight: FontWeight.bold),
        );
    },
);

3. Lecture ponctuelle sans abonnement (context.read)

Lors du clic sur un bouton d’action, nous souhaitons invoquer une méthode du modèle sans nous abonner à ses futures modifications. On utilise alors context.read<MonModele>().maMethode(), évitant ainsi toute reconstruction graphique inutile.

Synthèse pédagogique : Utilisez context.watch ou Consumer pour afficher des données réactives, et context.read à l’intérieur des callbacks d’actions pour préserver l’efficacité du moteur.