diff --git a/lib/features/statistics/statistics_screen.dart b/lib/features/statistics/statistics_screen.dart index 502f416c..c98c3514 100644 --- a/lib/features/statistics/statistics_screen.dart +++ b/lib/features/statistics/statistics_screen.dart @@ -11,7 +11,12 @@ import '../../services/statistics_service.dart'; class StatisticsScreen extends StatefulWidget { final Session? singleSession; - const StatisticsScreen({super.key, this.singleSession}); + /// Incrémenté par la navigation à chaque fois que l'onglet Stats est ouvert, + /// pour forcer un rechargement des données (l'écran est gardé vivant par un + /// IndexedStack, sinon les filtres arme/distance resteraient périmés). + final int refreshTick; + + const StatisticsScreen({super.key, this.singleSession, this.refreshTick = 0}); @override State createState() => _StatisticsScreenState(); @@ -44,6 +49,16 @@ class _StatisticsScreenState extends State { WidgetsBinding.instance.addPostFrameCallback((_) => _loadStatistics()); } + @override + void didUpdateWidget(StatisticsScreen oldWidget) { + super.didUpdateWidget(oldWidget); + // L'onglet vient d'être ré-ouvert : on recharge pour rafraîchir les listes + // de filtres (armes/distances) et les stats avec les nouvelles sessions. + if (oldWidget.refreshTick != widget.refreshTick) { + _loadStatistics(); + } + } + Future _loadStatistics() async { if (!mounted) return; setState(() => _isLoading = true); @@ -217,51 +232,64 @@ class _StatisticsScreenState extends State { ), body: _isLoading ? const Center(child: CircularProgressIndicator()) - : RefreshIndicator( - onRefresh: _loadStatistics, - child: SingleChildScrollView( - physics: const AlwaysScrollableScrollPhysics(), - padding: const EdgeInsets.all(16), - child: Column( - children: [ - // 1. FILTRES (Arme et Distance) - Row( - children: [ - Expanded( - child: _buildDropdown( - 'Arme utilisée', - _selectedWeapon, - _availableWeapons, - (val) { - setState(() { - _selectedWeapon = val!; - _calculateStats(); - }); - }, + : Column( + children: [ + // HEADER COLLANT : filtres + comparateur toujours visibles + Material( + elevation: 2, + color: Theme.of(context).scaffoldBackgroundColor, + child: Padding( + padding: const EdgeInsets.fromLTRB(16, 16, 16, 12), + child: Column( + children: [ + // 1. FILTRES (Arme et Distance) + Row( + children: [ + Expanded( + child: _buildDropdown( + 'Arme utilisée', + _selectedWeapon, + _availableWeapons, + (val) { + setState(() { + _selectedWeapon = val!; + _calculateStats(); + }); + }, + ), + ), + const SizedBox(width: 12), + Expanded( + child: _buildDropdown( + 'Distance', + _selectedDistance, + _availableDistances, + (val) { + setState(() { + _selectedDistance = val!; + _calculateStats(); + }); + }, + ), + ), + ], ), - ), - const SizedBox(width: 12), - Expanded( - child: _buildDropdown( - 'Distance', - _selectedDistance, - _availableDistances, - (val) { - setState(() { - _selectedDistance = val!; - _calculateStats(); - }); - }, - ), - ), - ], + const SizedBox(height: 12), + + // 1bis. COMPARATEUR DE SESSIONS + _buildComparator(), + ], + ), ), - const SizedBox(height: 16), - - // 1bis. COMPARATEUR DE SESSIONS - _buildComparator(), - const SizedBox(height: 20), - + ), + Expanded( + child: RefreshIndicator( + onRefresh: _loadStatistics, + child: SingleChildScrollView( + physics: const AlwaysScrollableScrollPhysics(), + padding: const EdgeInsets.all(16), + child: Column( + children: [ // 2. DONNÉES RAPIDES (Tirs et Sessions) Row( children: [ @@ -347,10 +375,13 @@ class _StatisticsScreenState extends State { ], const SizedBox(height: 30), - ], - ), + ], + ), + ), + ), + ), + ], ), - ), ); } diff --git a/lib/main_navigation_holder.dart b/lib/main_navigation_holder.dart index 6b1038b2..5f125653 100644 --- a/lib/main_navigation_holder.dart +++ b/lib/main_navigation_holder.dart @@ -15,25 +15,29 @@ class MainNavigationHolder extends StatefulWidget { class _MainNavigationHolderState extends State { int _selectedIndex = 0; - final List _screens = [ - const HomeScreen(), - const HistoryScreen(), - const StatisticsScreen(), - const WeaponListScreen(), - ]; + // 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). + int _statsTick = 0; void _onItemTapped(int index) { setState(() { _selectedIndex = index; + if (index == 2) _statsTick++; }); } @override Widget build(BuildContext context) { + final screens = [ + const HomeScreen(), + const HistoryScreen(), + StatisticsScreen(refreshTick: _statsTick), + const WeaponListScreen(), + ]; return Scaffold( body: IndexedStack( index: _selectedIndex, - children: _screens, + children: screens, ), bottomNavigationBar: Container( decoration: BoxDecoration(