Statistiques
La page Statistiques (StatsPage) affiche les résultats et statistiques détaillées d'une partie terminée, incluant le gagnant, les performances des joueurs et les métriques du jeu.
StatsPage
Type : ConsumerStatefulWidget
State : _StatsPageState extends ConsumerState<StatsPage> with WidgetsBindingObserver
Propriétés de constructeur
| Propriété | Type | Description |
|---|---|---|
gameCode |
String? |
Code de la partie |
winner |
String? |
Nom du joueur gagnant |
players |
List<PlayerModel>? | Liste des joueurs de la partie |
gameDuration |
int? |
Durée de la partie en secondes |
totalTurns |
int? |
Nombre total de tours |
tilesVisitedPercentage |
double? |
Pourcentage de tuiles visitées |
doorsToggledPercentage |
double? |
Pourcentage de portes activées |
totalTiles |
int? |
Nombre total de tuiles |
accessibleTiles |
int? |
Nombre de tuiles accessibles |
totalDoors |
int? |
Nombre total de portes |
Propriétés d'état
| Propriété | Type | Description |
|---|---|---|
_playerAvatarCache |
Map<String, String?> | Cache pour les URLs d'avatars des joueurs |
Méthodes
initState()
Description : Initialise la page, configure les statistiques et rejoint la room Socket.IO des stats.
Actions :
- Ajoute l'observer du cycle de vie de l'application
- Appelle
setGameStats()avec les données reçues - Appelle
joinStatsRoom()pour Socket.IO
Retour : void
dispose()
Description : Nettoie les ressources et retire l'observer.
Retour : void
didChangeAppLifecycleState(AppLifecycleState state)
Description : Détecte le retour de l'application au premier plan et vérifie l'état de la partie.
Comportement : Attend 2 secondes après le retour au premier plan, puis appelle _checkStatsState()
Retour : void
void _checkStatsState()
Description : Vérifie si le canal de partie existe toujours.
Action : Si le canal n'existe plus, affiche popup de déconnexion et quitte la room stats
Retour : void
void _showGameDisconnectedPopup(String message)
Description : Affiche un popup de déconnexion de partie et quitte la stats room.
Paramètres :
message: Message à afficher
Action : Appelle leaveStatsRoom() et navigue vers HomePage
Retour : void
void _leaveStatsPage()
Description : Quitte la page de stats et nettoie les ressources.
Actions :
- Quitte la stats room Socket.IO
- Nettoie le state des stats
- Navigue vers HomePage
- Focus sur le canal général
Retour : void
void _focusOnGeneralChannel()
Description : Active le canal de chat général après avoir quitté les stats.
Retour : void
String? _getPlayerAvatarUrl(String playerName)
Description : Récupère l'URL d'avatar d'un joueur (avec cache).
Paramètres :
playerName: Nom du joueur
Retour : String? (URL de l'avatar ou null)
String _formatDuration(int seconds)
Description : Formate une durée en secondes vers format "XXh XXmin XXs".
Paramètres :
seconds: Durée en secondes
Retour : String (ex: "1h 23min 45s")
Widget _buildHeader(...)
Description : Construit l'en-tête de la page avec titre et bouton de sortie.
Retour : Widget
Widget _buildWinnerSection(...)
Description : Construit la section affichant le gagnant avec avatar et nom.
Retour : Widget
Widget _buildPlayerRankings(...)
Description : Construit la liste classée des joueurs avec leurs statistiques.
Retour : Widget
Widget _buildGameStatistics(...)
Description : Construit la section des statistiques globales de la partie.
Retour : Widget
Widget _buildStatCard(...)
Description : Construit une carte de statistique individuelle.
Paramètres :
icon: Icône FontAwesomelabel: Libellé de la statistiquevalue: Valeur à afficherisTheme2: Si le thème 2 est actif
Retour : Widget
Éléments visuels
En-tête
- Titre : "STATISTIQUES DE LA PARTIE" centré
- Bouton Quitter : "QUITTER" (coin supérieur droit)
- Icône: Porte de sortie
- Action: Quitte la page et retourne à l'accueil
Section Gagnant
- Badge "GAGNANT" : En haut avec effet glow
- Avatar du gagnant : Grande image circulaire (200x200)
- Nom du gagnant : En grand sous l'avatar
- Fond : Panneau avec backdrop blur et bordures
Classement des Joueurs
- Liste scrollable : Affiche tous les joueurs
- Chaque carte de joueur contient :
- Numéro de rang (1er, 2ème, etc.)
- Avatar du joueur
- Nom du joueur
- Statistiques :
- Points de victoire
- Argent récolté
- Combats gagnés
- Objets ramassés
- Distance parcourue
- Style : Fond dégradé, bordures colorées, ombres
Statistiques Globales
- Cartes de stats : Grid layout avec cartes individuelles
- Durée de la partie
- Nombre de tours
- Tuiles visitées (%)
- Tuiles totales
- Tuiles accessibles
- Portes activées (%)
- Portes totales
- Style : Icônes FontAwesome, valeurs en grand, labels descriptifs
Overlays
- UserProfileWidget : Profil utilisateur
- ChatboxWidget : Chat flottant
Composants utilisés
UserProfileWidget
Widget de profil utilisateur.
ChatboxWidget
Widget de chat flottant.
OneButtonPopup
Popup modal avec un seul bouton.
Providers utilisés
statsNotifierProvider
Type : StateNotifierProvider<StatsNotifier, StatsState>
Provider gérant l'état des statistiques de partie.
StatsNotifier - Méthodes
void setGameStats(...)
Description : Définit les statistiques de la partie.
Paramètres :
gameCode: Code de la partiewinner: Nom du gagnantplayers: Liste des joueursgameDuration: Durée en secondestotalTurns: Nombre de tourstilesVisitedPercentage: % de tuiles visitéesdoorsToggledPercentage: % de portes activéestotalTiles: Nombre total de tuilesaccessibleTiles: Tuiles accessiblestotalDoors: Nombre total de portes
Retour : void
void joinStatsRoom({required String gameCode, required String firebaseUid, required String username})
Description : Rejoint la room Socket.IO des statistiques.
Paramètres :
gameCode: Code de la partiefirebaseUid: UID Firebase de l'utilisateurusername: Nom d'utilisateur
Retour : void
void leaveStatsRoom({required String gameCode, required String firebaseUid})
Description : Quitte la room Socket.IO des statistiques.
Paramètres :
gameCode: Code de la partiefirebaseUid: UID Firebase de l'utilisateur
Retour : void
void clearStats()
Description : Efface toutes les statistiques stockées.
Retour : void
authStateProvider
Type : Provider<UserEntity?>
Provider fournissant l'utilisateur authentifié actuel.
chatNotifierProvider
Type : StateNotifierProvider<ChatNotifier, ChatState>
Provider gérant l'état du chat.
ChatState
| Propriété | Type | Description |
|---|---|---|
userChannels |
List<ChannelEntity> | Liste des canaux de l'utilisateur |
friendsNotifierProvider
Type : StateNotifierProvider<FriendsNotifier, FriendsState>
Provider gérant la liste des amis.
translationProvider
Type : Provider<TranslationWrapper>
Provider pour la gestion de l'internationalisation.
themeNotifierProvider
Type : StateNotifierProvider<ThemeNotifier, ThemeState>
Provider gérant le thème actif.
Écouteurs Socket.IO
La page utilise la room Socket.IO des statistiques pour détecter quand la partie est supprimée:
Events écoutés
- gameDeleted : Quand la partie est supprimée du serveur
- playerKicked : Si le joueur est expulsé de la partie
Comportement
Si ces events sont détectés, la page affiche un popup de déconnexion et redirige vers HomePage.
Navigation
- Quitter :
AppRoutes.home.path→HomePage
Lifecycle management
La page implémente WidgetsBindingObserver pour détecter:
- App au premier plan : Vérifie si la partie existe toujours
- App en arrière-plan : Pas d'action spécifique
Format des statistiques
Durée
Format: "Xh Xmin Xs"
Exemple: "1h 23min 45s"
Pourcentages
Format: "XX.X%"
Exemple: "75.5%"
Nombres entiers
Format: Nombre brut
Exemple: "42"
Distance
Format: "XX tuiles"
Exemple: "127 tuiles"
Ordre des joueurs
Les joueurs sont affichés dans l'ordre du classement final de la partie:
- 1er place (gagnant)
- 2ème place
- 3ème place
- etc.
Le gagnant est également affiché séparément dans la section dédiée en haut de la page.