Documentation Application Mobile
L'application mobile de CyberCity est développée avec Flutter, permettant un déploiement sur iOS, Android, et Web. Elle suit une architecture Clean en trois couches (Presentation, Domain, Data) pour assurer la maintenabilité, la testabilité et la séparation des responsabilités. Cette documentation présente la structure et le fonctionnement de l'application mobile selon une approche technique, organisée autour des principales pages.
Architecture Générale
L'application mobile utilise une architecture Clean Architecture avec injection de dépendances via GetIt et gestion d'état avec Riverpod. Cette architecture garantit:
- Indépendance des frameworks: Le code métier ne dépend pas de Flutter
- Testabilité: Chaque couche peut être testée indépendamment
- Séparation des responsabilités: Chaque couche a un rôle précis
- Maintenabilité: Modifications facilitées et code réutilisable
Technologies utilisées
Framework et langages
- Flutter : Framework de développement multiplateforme
- Dart : Langage de programmation
- Riverpod : Gestion d'état réactive
- GetIt : Injection de dépendances
Communication
- Socket.IO : Communication temps réel avec le serveur
- Firebase Authentication : Authentification des utilisateurs
- HTTP/Dio : API REST pour les ressources
UI/UX
- Material Design : Design system de base
- Custom Theme : Thèmes cyberpunk personnalisés (theme1, theme2)
- Orbitron : Police de caractères principale
- Flutter SVG : Rendu des sprites et icônes
- Flutter Markdown : Affichage du contenu d'aide
Structure de l'application
L'application est composée de:
- 10 Pages principales : Vues de l'application (ConsumerStatefulWidget)
- Widgets réutilisables : Composants UI partagés
- Providers (Riverpod) : Gestion d'état et logique business
- Use Cases : Actions métier isolées
- Repositories : Abstraction des sources de données
- Data Sources : Communication serveur (Socket.IO, HTTP)
- Models/Entities : Représentation des données
Pages de l'Application
Toutes les pages sont des ConsumerStatefulWidget qui écoutent et réagissent aux changements d'état via Riverpod.
0. Page d'Authentification (AuthPage)
Type : ConsumerStatefulWidget
Chemin : features/auth/presentation/pages/auth_page.dart
Fonctionnalité : Point d'entrée de l'application permettant la connexion et l'inscription via Firebase Authentication.
Providers principaux :
authNotifierProvider<AuthNotifier, AuthState>: Gestion de l'authentificationtranslationProvider<TranslationWrapper>: Internationalisation
Composants clés :
AuthForm: Formulaire principal (connexion/inscription)OneButtonPopup: Dialogues d'informationLanguageSelectorWidget: Choix de langue
Use Cases :
SignInUseCase,SignInWithUsernameUseCase,SignUpUseCase,SignOutUseCase,CheckUsernameUseCase
Navigation : HomePage (après connexion)
1. Page d'Accueil (HomePage)
Type : ConsumerStatefulWidget
Chemin : features/home/presentation/pages/home_page.dart
Fonctionnalité : Hub central post-authentification avec accès aux fonctionnalités principales.
Providers principaux :
userNotifierProvider<UserNotifier, UserState>: Profil utilisateurgameNotifierProvider<GameNotifier, GameState>: Préchargement des jeuxthemeNotifierProvider<ThemeNotifier, ThemeState>: Gestion des thèmes
Composants clés :
MainButton/CyberButton: Boutons de navigationUserProfileWidget: Profil avec avatar, stats, soldeChatboxWidget: Interface de chat flottanteHelpButtonWidget,HelpPopupWidget: Aide contextuelle
Fonctionnalités :
- Popup de saisie de code (4 chiffres) pour rejoindre une partie
- Bouton boutique (coin supérieur droit)
- Préchargement des données utilisateur et des jeux
Navigation : JoinPage, GameCreationPage, ShopPage, HelpPage
2. Création de Partie (GameCreationPage)
Type : ConsumerStatefulWidget
Chemin : features/game/presentation/pages/game_creation_page.dart
Fonctionnalité : Sélection d'un jeu et configuration des paramètres de partie.
Providers principaux :
gameNotifierProvider<GameNotifier, GameState>: Liste des jeuxgameConfigNotifierProvider<GameConfigNotifier, GameConfigState>: Configuration
Composants clés :
GameBoxWidget: Carte de jeu avec aperçuPageView: Carrousel de jeux (3 par page)- Popup de configuration avec options
Paramètres configurables :
- Visibilité : Public / Amis
- Drop-in/Drop-out : Activé/Désactivé
- Droit d'entrée : 0-100 coins (avec
_MaxValueFormatter)
Écouteurs Socket.IO :
playableGamesUpdated: Rechargement automatique de la liste
Navigation : CharacterCreationPage (mode "create")
3. Page de Rejoindre (JoinPage)
Type : ConsumerStatefulWidget
Chemin : features/game/presentation/pages/join_page.dart
Fonctionnalité : Liste des parties publiques disponibles et rejoindre via code.
Providers principaux :
joinGameNotifierProvider<JoinGameNotifier, JoinGameState>: Logique de joinfriendsNotifierProvider<FriendsNotifier, FriendsState>: Filtre amis
Composants clés :
- Grille de cartes de parties (2 colonnes)
- Popup de saisie de code (4 chiffres)
CodeInputFormatter: Gestion du backspace sur champs vides
Fonctionnalités :
- Rafraîchissement automatique (Timer 10s)
- Filtrage selon visibilité (public/amis)
- Détection drop-in (rejoindre partie en cours)
- Cache d'images de grille
Écouteurs Socket.IO :
dropInGameData: Navigation directe vers GameView- Mises à jour de la liste de parties
Navigation : CharacterCreationPage (mode "join"), GameViewPage (drop-in)
4. Création de Personnage (CharacterCreationPage)
Type : ConsumerStatefulWidget
Chemin : features/game/presentation/pages/character_creation_page.dart
Fonctionnalité : Choix d'avatar et de nom de personnage.
Providers principaux :
characterCreationNotifierProvider<CharacterCreationNotifier, CharacterCreationState>: État de créationwaitingRoomNotifierProvider<WaitingRoomNotifier, WaitingRoomState>: Synchronisation avec la partie
Composants clés :
- Grille d'avatars (4 colonnes) depuis
GameCharacters.gameCharacters - Champ de saisie de nom (validation temps réel)
Validations :
- Avatar sélectionné et non pris
- Nom : 1-12 caractères, alphanumériques + espaces
- Nom unique (mode join)
Limites de joueurs :
- Grille 10x10 : max 2
- Grille 15x15 : max 4
- Grille 20x20 : max 6
Écouteurs Socket.IO :
gameLockUpdated: Détection de partie pleine
Navigation : WaitingRoomPage
5. Salle d'Attente (WaitingRoomPage)
Type : ConsumerStatefulWidget
Chemin : features/game/presentation/pages/waiting_room_page.dart
Fonctionnalité : Attente des joueurs et lancement de la partie (hôte).
Providers principaux :
waitingRoomNotifierProvider<WaitingRoomNotifier, WaitingRoomState>: État de la sallegameViewProvider(providerKey): Initialisation de la game view
Composants clés :
- Cartes de joueurs (2 colonnes)
- Bouton "LANCER LA PARTIE" (hôte uniquement)
- Code de partie copiable
AssetPreloaderService: Préchargement des assets
Fonctionnalités hôte :
- Lancer la partie (min 2 joueurs)
- Expulser des joueurs
- Annuler la partie (en quittant)
Écouteurs Socket.IO :
gameStarted: Navigation vers GameViewplayerJoined,playerLeft,playerKicked,gameCancelled
Navigation : GameViewPage (démarrage), HomePage (quitter/expulsé/annulé)
6. Vue de Jeu (GameViewPage)
Type : ConsumerStatefulWidget with WidgetsBindingObserver
Chemin : features/game/presentation/pages/game_view_page.dart
Fonctionnalité : Interface de jeu en temps réel avec grille, commandes et inventaire.
Providers principaux :
gameViewProvider(providerKey)<GameViewNotifier, GameViewState>: État du jeucombatProvider(providerKey)<CombatNotifier, CombatState>: Gestion des combats
Composants clés :
GridWidget: Grille de jeu interactive (zoom, pan)PlayerInfoWidget: Stats du joueur (vie, actions, argent, VP)PlayersListWidget: Liste des joueurs avec ordre de tourGameTimerInfoWidget: Timer et infos de partiePlayerCommandsWidget: Boutons d'actionTileInformationWidget: Infos de tuile sélectionnéeCombatMenuWidget: Interface de combatTrapPopupWidget,ItemRejectPopupWidget: Popups d'events
Écouteurs Socket.IO (via GameViewNotifier) :
gameUpdated,playerMoved,playerTurnChangedcombatStarted,combatRollResult,combatEndeditemPickedUp,doorToggledtrapActivated,itemRejectedgameEnded,gameAborted,playerKicked,gameDisconnected
Lifecycle management :
- Détecte retour au premier plan (vérification état)
- Gestion de déconnexion gracieuse
- Reconnexion Socket.IO
Navigation : StatsPage (fin de partie), HomePage (quitter/déconnecté)
7. Statistiques (StatsPage)
Type : ConsumerStatefulWidget with WidgetsBindingObserver
Chemin : features/stats/presentation/pages/stats_page.dart
Fonctionnalité : Affichage des résultats et statistiques post-partie.
Providers principaux :
statsNotifierProvider<StatsNotifier, StatsState>: Statistiques de partie
Composants clés :
- Section gagnant (avatar grand format)
- Classement des joueurs avec stats détaillées
- Grille de statistiques globales
Données affichées :
- Gagnant, classement final
- Stats par joueur : VP, argent, combats, items, distance
- Stats globales : durée, tours, tuiles visitées, portes activées
Écouteurs Socket.IO :
- Jointure de la stats room
- Détection de suppression de partie
Lifecycle management :
- Vérification de l'existence du canal de partie au retour
Navigation : HomePage (quitter)
8. Boutique (ShopPage)
Type : ConsumerStatefulWidget
Chemin : features/shop/presentation/pages/shop_page.dart
Fonctionnalité : Achat d'éléments cosmétiques avec monnaie virtuelle.
Providers principaux :
shopNotifierProvider<ShopNotifier, ShopState>: Logique d'achatuserProfileProvider<UserProfileEntity?>: Solde et historique
Composants clés :
ShopItemWidget: Cartes d'articles- Layout personnalisé : 5 colonnes (3 grandes + 2x2 petites)
- Popups de confirmation et d'erreur
Fonctionnalités :
- Vérification des fonds (
checkFunds) - Achat d'articles (
purchaseItem) - Affichage du solde en temps réel
- Indicateurs d'articles possédés
Use Cases :
CheckFundsUseCase,PurchaseItemUseCase
Articles : 7 items (avatars, profils de différentes raretés)
Navigation : HomePage (retour), HelpPage (aide complète)
9. Aide (HelpPage)
Type : ConsumerStatefulWidget
Chemin : features/help/presentation/pages/help_page.dart
Fonctionnalité : Documentation complète de l'application en deux panneaux.
Providers principaux :
translationProvider<TranslationWrapper>: Contenu multilingue
Composants clés :
- Panneau gauche : Liste de 16 sections (300px)
- Panneau droit : Contenu Markdown
flutter_markdown: Rendu du contenu- Style sheet personnalisé adaptatif au thème
Sections (16 au total) :
- Pages principales, modes de jeu, combat, items, social, astuces, FAQ
Style :
- Backdrop blur (effet verre dépoli)
- Scrollbars stylisées
- Layout responsive (max-width 1200px)
Navigation : HomePage (retour)
Architecture Clean
Couche Presentation
Technologies : Flutter, Riverpod
Responsabilités :
- Pages (ConsumerStatefulWidget)
- Widgets réutilisables
- Providers (StateNotifier)
- UI State management
Pattern : MVVM avec Riverpod
Couche Domain
Technologies : Dart pur (indépendant de Flutter)
Responsabilités :
- Entities (modèles métier)
- Repository interfaces
- Use Cases (logique métier isolée)
Principe : Dependency Inversion (les détails dépendent des abstractions)
Couche Data
Technologies : Dio (HTTP), Socket.IO, Firebase
Responsabilités :
- Repository implementations
- Data sources (Remote, Socket)
- Models (sérialization JSON)
- Services (Socket, HTTP)
Pattern : Repository pattern
Gestion d'État (Riverpod)
Types de providers utilisés
StateNotifierProvider
Pour l'état mutable avec logique business :
StateNotifierProvider<AuthNotifier, AuthState>
StateNotifierProvider<GameViewNotifier, GameViewState>
Provider
Pour les dépendances et services :
Provider<TranslationWrapper>
Provider<SocketService>
FutureProvider / StreamProvider
Pour les données asynchrones
Pattern de state
Tous les states utilisent copyWith pour l'immutabilité :
class AuthState {
final bool isLoading;
final String? errorMessage;
AuthState copyWith({bool? isLoading, String? errorMessage}) { ... }
}
Communication Serveur
Socket.IO
Service : SocketService (singleton)
Connexion :
- Authentification avec token Firebase
- Reconnexion automatique
- Gestion des événements globaux
Events principaux :
- Authentication, game updates, chat, friends, combat, stats
Pattern :
socket.on('eventName', (data) => { ... });
socket.emit('eventName', data);
HTTP/REST
Service : Dio avec intercepteurs
Endpoints :
- Auth, user profile, games, shop, stats
Pattern :
final response = await dio.get('/endpoint',
options: Options(headers: {'Authorization': 'Bearer $token'}));
Firebase
Services utilisés :
- Firebase Auth : Authentification
- Firebase Storage : Upload d'avatars personnalisés
Internationalisation (i18n)
Langues : Français, English
Service : TranslationService
Provider : translationProvider
Usage :
ref.watch(translationProvider).translate('AUTH_PAGE.SIGN_IN')
Fichiers : JSON avec clés hiérarchiques
Thèmes
Thèmes disponibles :
- theme1 : Magenta/Purple cyberpunk
- theme2 : Cyan/Blue cyberpunk
Provider : themeNotifierProvider<ThemeNotifier, ThemeState>
Personnalisation :
- Couleurs, ombres, bordures
- Logos, backgrounds
- Adaptations UI selon thème
Navigation
Router : GoRouter (go_router package)
Routes : Définies dans AppRoutes
Navigation :
context.go(AppRoutes.home.path)
context.go(AppRoutes.gameView.path, extra: {...})
Paramètres : Passés via extra ou query params
Widgets Réutilisables
Widgets communs
UserProfileWidget: Profil avec avatar, stats, déconnexionChatboxWidget: Interface de chat flottanteHelpButtonWidget: Bouton d'aide circulaireHelpPopupWidget: Popup d'aide avec MarkdownOneButtonPopup: Dialogue modal simpleTwoButtonPopup: Dialogue de confirmation
Widgets de jeu
GridWidget: Grille de jeu avec zoom/panPlayerInfoWidget: Informations du joueurPlayersListWidget: Liste des joueursGameTimerInfoWidget: Timer et infosPlayerCommandsWidget: Boutons d'actionTileInformationWidget: Infos de tuileCombatMenuWidget: Interface de combatGameLoadingOverlay: Overlay de chargement
Widgets de boutique
ShopItemWidget: Carte d'article
Widgets d'aide
LanguageSelectorWidget: Sélecteur de langue
Services
SocketService
Gestion de la connexion Socket.IO (singleton)
AssetPreloaderService
Préchargement des assets de jeu (sprites, images)
TranslationService
Traductions multilingues
HelpService
Contenu d'aide contextuel par route
Dépendances principales
dependencies:
flutter:
sdk: flutter
flutter_riverpod: ^2.x
go_router: ^14.x
socket_io_client: ^2.x
firebase_auth: ^5.x
firebase_storage: ^12.x
dio: ^5.x
flutter_svg: ^2.x
flutter_markdown: ^0.7.x
get_it: ^7.x
font_awesome_flutter: ^10.x
Points clés de l'architecture
- Séparation des responsabilités : Clean Architecture en 3 couches
- Gestion d'état réactive : Riverpod avec StateNotifier
- Communication temps réel : Socket.IO avec reconnexion automatique
- Internationalisation : Support FR/EN complet
- Thèmes : 2 thèmes cyberpunk personnalisés
- Navigation : GoRouter avec paramètres typés
- Lifecycle : Gestion de l'état de l'app (background/foreground)
- Performance : Préchargement, cache d'images
- UX : Popups, animations, feedback utilisateur
- Maintenabilité : Code modulaire, widgets réutilisables