quel-est-ce-pokemon/docs/ARCHITECTURE.md

193 lines
6.3 KiB
Markdown

# Architecture du Projet - Pokéguess
## Vue d'ensemble
Application Flutter affichant les 151 premiers Pokémon avec noms en français, via l'API Tyradex et cache local SQLite.
### Informations
- **Version** : 1.0.0+1
- **SDK** : Flutter >=3.1.0 <4.0.0
- **Plateformes** : Android, iOS, Web, macOS, Linux, Windows
## Architecture Générale
L'application suit une architecture en couches (layered architecture) avec une séparation claire des responsabilités :
```txt
┌─────────────────────────────────────────┐
│ Couche Présentation │
│ (Pages & Components/Widgets) │
├─────────────────────────────────────────┤
│ Couche Métier │
│ (Models) │
├─────────────────────────────────────────┤
│ Couche Services │
│ (API & Database & Utils) │
└─────────────────────────────────────────┘
```
## Structure du Projet
```md
lib/
├── main.dart # Point d'entrée de l'application
├── api/
│ └── pokemon_api.dart # Service d'accès à l'API Tyradex
├── components/
│ ├── pokemon_tile.dart # Widget de tuile pour afficher un Pokémon
│ └── pokemon_type.dart # Widget pour afficher le type d'un Pokémon
├── database/
│ └── pokedex_database.dart # Gestion de la base de données SQLite
├── models/
│ └── pokemon.dart # Modèle de données Pokémon
├── pages/
│ ├── pokemon_detail.dart # Page de détail d'un Pokémon
│ └── pokemon_list.dart # Page de liste des Pokémon
└── utils/
└── pokemon_type.dart # Utilitaires pour les types de Pokémon
```
## Composants Principaux
### 1. Point d'Entrée
[main.dart](../lib/main.dart) - Initialisation de l'application
- Thème Material Design 3
- Routes : `/` (liste) et `/pokemon-detail` (détail)
### 2. Couche Présentation
#### Pages
##### PokemonListPage ([pokemon_list.dart](../lib/pages/pokemon_list.dart))
StatefulWidget affichant une grille de 151 Pokémon (2 colonnes mobile, 4 web) via `GridView.builder` et `FutureBuilder`.
##### PokemonDetailPage ([pokemon_detail.dart](../lib/pages/pokemon_detail.dart))
StatefulWidget affichant les détails d'un Pokémon avec toggle shiny (`_isShiny`) via `GestureDetector`.
#### Components
##### PokemonTile ([pokemon_tile.dart](../lib/components/pokemon_tile.dart))
StatefulWidget affichant une carte Pokémon (image + nom) avec navigation vers détail au tap.
##### PokemonTypeWidget ([pokemon_type.dart](../lib/components/pokemon_type.dart))
StatelessWidget affichant un badge coloré par type.
### 3. Couche Modèle
#### Pokemon ([pokemon.dart](../lib/models/pokemon.dart))
- **Propriétés** :
- `name` : String - Nom du Pokémon
- `id` : int - Numéro du Pokémon
- `type1` : PokemonType - Type principal
- `type2` : PokemonType? - Type secondaire (optionnel)
- **Propriétés calculées** : `imageUrl`, `shinyImageUrl`, `cryUrl`, `formatedName`, `type1Color`, `type2Color`, `type1Formated`, `type2Formated`
- **Méthodes** : `fromJson()`, `toJson()`, `fromID()` (cache + API)
- **Enum** : `PokemonType` (20 types)
### 4. Couche Services
#### PokemonApi ([pokemon_api.dart](../lib/api/pokemon_api.dart))
Communication avec Tyradex API (<https://tyradex.vercel.app>)
- `getPokemon(int id)` : Récupère un Pokémon depuis l'API avec nom en français
- Exception levée si code HTTP ≠ 200
#### PokedexDatabase ([pokedex_database.dart](../lib/database/pokedex_database.dart))
Gestion SQLite locale (CRUD complet)
- **Schéma** : `pokemon (id, name, type1, type2)`
- **Méthodes** : `initDatabase()`, `getDatabase()`, `insertPokemon()`, `getPokemonList()`, `getPokemon()`, `deletePokemon()`, `deleteAllPokemon()`, `updatePokemon()`
- Non disponible sur Web (`kIsWeb`)
#### Utils ([pokemon_type.dart](../lib/utils/pokemon_type.dart))
- `frenchTypeToEnum()` : Conversion types français (API) vers enum
- `typeToColor()` : Mapping type → couleur
- `formatedTypeName()` : Formatage nom de type
## Flux de Données
### Récupération d'un Pokémon
```md
1. PokemonListPage demande Pokemon.fromID(id)
2. Vérification dans PokedexDatabase (si non-web)
3a. Si trouvé → Retour du Pokémon en cache
3b. Si non trouvé → Appel à PokemonApi.getPokemon(id)
4. Parsing JSON et création de l'objet Pokemon
5. Sauvegarde dans PokedexDatabase (si non-web)
6. Retour du Pokemon à la vue
```
### Navigation
```md
PokemonListPage
↓ (tap sur PokemonTile)
Navigator.pushNamed('/pokemon-detail', arguments: pokemon)
PokemonDetailPage (récupère le pokemon via ModalRoute)
```
## Patterns et Bonnes Pratiques
**Patterns** : Repository (classe `Pokemon`), Factory (`fromJson()`), FutureBuilder (async)
**Plateformes** : Détection Web via `kIsWeb`, adaptation colonnes grille
**Erreurs** : Try/catch + logs, vérification HTTP, messages dans FutureBuilder
## Dépendances
**Production** : `flutter`, `cupertino_icons` (^1.0.2), `sqflite` (^2.3.0), `http` (^1.1.0)
**Développement** : `flutter_test`, `flutter_lints` (^2.0.0)
## Points d'Extension
1. Recherche et filtres (type, génération)
2. Mode jeu (deviner à partir de silhouette, score)
3. Système de favoris
4. Lecture audio des cris
5. Détails enrichis (stats, évolutions, capacités)
6. Préchargement offline des 151 Pokémon
7. Tests unitaires et d'intégration
## Limitations
1. Pas de persistance locale sur Web
2. Limité à 151 Pokémon (Gen 1)
3. Gestion d'erreur minimale
4. Pas d'internationalisation
5. Pas de tests automatisés
## Notes Techniques
- Material Design 3
- Images : repository Yarkis01/TyraDex (GitHub)
- API : Tyradex API (https://tyradex.vercel.app)
- Noms de Pokémon en français
- Routage : routes nommées Flutter
- Pas de state management externe
---
**Dernière mise à jour** : 2 février 2026