diff --git a/lib/screens/dashboard_screen.dart b/lib/screens/dashboard_screen.dart index ab3acb2..69da71f 100644 --- a/lib/screens/dashboard_screen.dart +++ b/lib/screens/dashboard_screen.dart @@ -72,11 +72,9 @@ class _DashboardScreenState extends State { // à l'écran le 2026-09-06 — le correctif « charger au montage » n'a rien changé. // Accroché au tick, il se rattrape de lui-même dès que la box répond. final cfg = context.read(); - if (cfg.entries.isEmpty) { - cfg - ..attach(svc) - ..load(); - } + if (cfg.entries.isEmpty) cfg..attach(svc)..load(); + final tel = context.read(); + if (tel.telemetry == null) tel..attach(svc)..load(); // Les ratios de la box sont lus à côté du bilan, pas à sa place : ils ne couvrent pas // la même fenêtre, et c'est justement ce que l'écran doit pouvoir dire. final r = await svc.fetchEnergyRatios(); @@ -119,22 +117,32 @@ class _DashboardScreenState extends State { return out; } - /// Vrai une fois la configuration demandée avec une box joignable — évite de relancer - /// l'appel à chaque trame pendant que la réponse arrive. - bool _configDemandee = false; + /// Vrai une fois les deux providers demandés avec une box joignable — évite de relancer + /// les appels à chaque trame pendant que les réponses arrivent. + bool _chargesDemandees = false; - /// Le tick est à cinq minutes : trop lent pour un premier chargement. On se raccroche - /// donc aussi au moment où la box devient joignable, une seule fois. - void _assurerConfig(NymeaService service) { - if (_configDemandee || !service.isConnected) return; + /// **Les DEUX providers, pas un seul.** + /// + /// Le détail de consommation croise la télémétrie (la mesure) et la configuration (le + /// domaine). Or ni l'un ni l'autre n'était attaché ailleurs que sur l'écran des rôles : + /// sur le tableau de bord, `telemetry` était `null` **et** `entries` vide. + /// + /// Deux correctifs ont échoué avant celui-ci parce qu'ils ne traitaient que la + /// configuration — la moitié que le premier diagnostic avait désignée. Vérifier le + /// correctif sur la partie qu'on vient d'écrire ne dit rien de l'autre moitié : + /// c'est la recherche auto-confirmante, en version « je n'ai regardé qu'un provider ». + /// + /// Le tick à cinq minutes rattrape ; c'est ici que ça se joue au premier affichage. + void _assurerCharges(NymeaService service) { + if (_chargesDemandees || !service.isConnected) return; final cfg = context.read(); - if (cfg.entries.isNotEmpty) return; - _configDemandee = true; + final tel = context.read(); + if (cfg.entries.isNotEmpty && tel.telemetry != null) return; + _chargesDemandees = true; WidgetsBinding.instance.addPostFrameCallback((_) { if (!mounted) return; - cfg - ..attach(service) - ..load(); + if (cfg.entries.isEmpty) cfg..attach(service)..load(); + if (tel.telemetry == null) tel..attach(service)..load(); }); } @@ -142,7 +150,7 @@ class _DashboardScreenState extends State { Widget build(BuildContext context) { return Consumer( builder: (context, service, _) { - _assurerConfig(service); + _assurerCharges(service); final data = service.energyData; return Scaffold( backgroundColor: EtmTokens.bgOf(context),