diff --git a/lib/features/analysis/widgets/target_calibration.dart b/lib/features/analysis/widgets/target_calibration.dart index 0cc5b2bd..556a7b44 100644 --- a/lib/features/analysis/widgets/target_calibration.dart +++ b/lib/features/analysis/widgets/target_calibration.dart @@ -4,6 +4,7 @@ /// Les anneaux sont répartis proportionnellement. library; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import '../../../core/theme/app_theme.dart'; import '../../../data/models/target_type.dart'; @@ -130,7 +131,14 @@ class TargetCalibrationState extends State { _currentEspacementRatio = (_radius > 0) ? (_innerRadius / _radius).clamp(0.01, 0.70) : 0.1; shouldReinit = true; } - if (widget.initialRingRadii != oldWidget.initialRingRadii && widget.initialRingRadii != null) { + // On ne rafraîchit le profil d'usine que si les rayons entrants proviennent + // réellement d'une nouvelle détection (ils diffèrent de notre état courant). + // Sinon il s'agit de l'écho de notre propre _notifyChange (aller-retour via + // le provider) : le clobber effacerait le profil d'origine et casserait le + // bouton de réinitialisation de l'espacement. + if (widget.initialRingRadii != oldWidget.initialRingRadii && + widget.initialRingRadii != null && + !listEquals(widget.initialRingRadii, _ringRadii)) { _originalRingRadii = List.from(widget.initialRingRadii!); shouldReinit = true; } diff --git a/lib/features/history/history_screen.dart b/lib/features/history/history_screen.dart index 0bc0fbe5..c16662b2 100644 --- a/lib/features/history/history_screen.dart +++ b/lib/features/history/history_screen.dart @@ -11,7 +11,13 @@ import 'widgets/session_list_item.dart'; import 'widgets/history_chart.dart'; class HistoryScreen extends StatefulWidget { - const HistoryScreen({super.key}); + /// Incrémenté par la navigation à chaque ouverture de l'onglet Historique, + /// pour forcer un rechargement des sessions (l'écran est gardé vivant par un + /// IndexedStack, sinon une session tout juste clôturée n'apparaîtrait pas + /// tant qu'on ne tire pas manuellement pour rafraîchir). + final int refreshTick; + + const HistoryScreen({super.key, this.refreshTick = 0}); @override State createState() => _HistoryScreenState(); @@ -31,6 +37,16 @@ class _HistoryScreenState extends State { _loadSessions(); } + @override + void didUpdateWidget(HistoryScreen oldWidget) { + super.didUpdateWidget(oldWidget); + // L'onglet vient d'être ré-ouvert : on recharge pour afficher les sessions + // récemment clôturées sans avoir à tirer manuellement pour rafraîchir. + if (oldWidget.refreshTick != widget.refreshTick) { + _loadSessions(); + } + } + Future _loadSessions() async { if (!mounted) return; setState(() => _isLoading = true); diff --git a/lib/main_navigation_holder.dart b/lib/main_navigation_holder.dart index 5f125653..26d10b2c 100644 --- a/lib/main_navigation_holder.dart +++ b/lib/main_navigation_holder.dart @@ -15,13 +15,16 @@ class MainNavigationHolder extends StatefulWidget { class _MainNavigationHolderState extends State { int _selectedIndex = 0; - // Incrémenté à chaque ouverture de l'onglet Stats pour forcer le rechargement - // (l'écran est gardé vivant par l'IndexedStack et ne se rafraîchit pas seul). + // Incrémentés à chaque ouverture de l'onglet correspondant pour forcer le + // rechargement (les écrans sont gardés vivants par l'IndexedStack et ne se + // rafraîchissent pas seuls). int _statsTick = 0; + int _historyTick = 0; void _onItemTapped(int index) { setState(() { _selectedIndex = index; + if (index == 1) _historyTick++; if (index == 2) _statsTick++; }); } @@ -30,7 +33,7 @@ class _MainNavigationHolderState extends State { Widget build(BuildContext context) { final screens = [ const HomeScreen(), - const HistoryScreen(), + HistoryScreen(refreshTick: _historyTick), StatisticsScreen(refreshTick: _statsTick), const WeaponListScreen(), ];