Application Flutter multiplateforme (Android, iOS, Web) pour centraliser la gestion d'un voyage entre amis:
- covoiturage
- courses
- planification des repas
- partage des depenses
- suggestion et planification d'activtés
- informations pratiques
- messagerie
Offrir un seul espace collaboratif pour preparer et suivre un voyage de groupe sans jongler entre plusieurs applis.
- Frontend: Flutter (Dart)
- Backend as a Service: Firebase
- Authentication
- Cloud Firestore
- Cloud Functions (optionnel au debut)
- Firebase Storage (pieces jointes, photos)
- Firebase Cloud Messaging (notifications)
- Installer Flutter SDK (canal stable) et ajouter
<flutter>/binauPATH. - Installer Android Studio (inclut SDK Android, outils Gradle et JDK
jbr). - Sur Windows, activer Mode developpeur (plugins Flutter avec symlinks).
- Installer Node.js LTS (necessaire pour
npm), puis la Firebase CLI:npm install -g firebase-tools
- Installer Java 17+ (recommande: JDK inclus d'Android Studio:
...\Android Studio\jbr). - Configurer les variables d'environnement Windows:
JAVA_HOME-> chemin du JDK sans\bin(ex:C:\Program Files\Android\Android Studio\jbr)- ajouter
%JAVA_HOME%\binauPath - ajouter
C:\Users\<ton-user>\AppData\Local\Pub\Cache\binauPath(pourflutterfire)
- Ouvrir un nouveau terminal et verifier:
flutter --version
dart --version
java -version
firebase --versionVerification complementaire recommandee sous Windows (utile si Gradle ne trouve pas Java):
echo $env:JAVA_HOME
where.exe java
java -versionSi where.exe java ne retourne rien:
- verifier que
JAVA_HOMEpointe bien vers le dossier JDK (pas...\jbr\bin) - verifier que
%JAVA_HOME%\binest present dansPath - fermer completement Cursor/terminal puis reouvrir une nouvelle session
git clone <url-du-repo> Planerz
cd Planerz
flutter pub getfirebase login
dart pub global activate flutterfire_cliSi flutterfire n'est pas reconnu, utiliser:
dart pub global run flutterfire_cli:flutterfire --versionDans la console Firebase:
- Creer ou choisir le projet (ex:
planerz) - Authentication -> Sign-in method -> activer Google
- Firestore Database -> creer la base (mode dev/test)
- Creer les apps de plateforme necessaires (Android, iOS, Web)
Depuis android/:
./gradlew signingReport.\gradlew signingReport- Copier la valeur SHA1 (et idealement SHA-256) du variant
debug. - Firebase -> Project settings -> app Android -> Add fingerprint.
- Sur une nouvelle machine de dev physique, refaire cette etape: le keystore debug local peut changer, donc il faut ajouter les nouveaux fingerprints.
- Pour extraire les empreintes du keystore de signature (
.jks) (release), utiliserkeytool:
keytool -list -v -keystore ".\planerz-keystore.jks" -alias "planerz"Si tu ne connais pas l'alias du keystore:
keytool -list -keystore ".\planerz-keystore.jks"- Telecharger
google-services.jsonapres ajout des fingerprints, puis le placer selon le flavor:android/app/src/preview/google-services.jsonpour--flavor previewandroid/app/src/prod/google-services.jsonpour--flavor prod
- Telecharger
GoogleService-Info.plistdepuis l'app iOS Firebase. - Le placer dans
ios/Runner/GoogleService-Info.plist. - Verifier que
ios/Runner/Info.plistcontientCFBundleURLTypesavec leREVERSED_CLIENT_ID.
Ne pas utiliser une config unique (lib/firebase_options.dart) pour ce projet:
on maintient explicitement deux fichiers:
lib/firebase_options_preview.dartlib/firebase_options_prod.dart
Depuis la racine du projet, lancer les deux commandes suivantes:
dart pub global run flutterfire_cli:flutterfire configure --project=planerz-preview --out=lib/firebase_options_preview.dart --android-package-name=fr.centuryspine.planerz.preview --ios-bundle-id=fr.centuryspine.planerz.preview --yesdart pub global run flutterfire_cli:flutterfire configure --project=planerz --out=lib/firebase_options_prod.dart --android-package-name=fr.centuryspine.planerz --ios-bundle-id=fr.centuryspine.planerz --yesNotes importantes:
- Si FlutterFire propose de reutiliser des apps avec un mauvais package/bundle id, refuser et recreer les bonnes apps.
- Pour le web, il n'y a pas de package name Android/iOS, mais il faut garder une web app dediee par projet (
planerz-previewvsplanerz) et regenerer les options pour recuperer les bonsappId/apiKey. - Verifier ensuite que les fichiers Android restent bien separes par flavor:
android/app/src/preview/google-services.jsonandroid/app/src/prod/google-services.json
flutter clean
flutter pub get
flutter run -d windowsFlux de test minimal:
- Ecran Connexion -> bouton Continuer avec Google
- Ecran Mes voyages
- Bouton Nouveau voyage -> creation visible dans Firestore (
trips) - Document utilisateur cree/maj dans Firestore (
users/{uid})
Le depot est configure pour parler aux emulateurs Auth, Firestore, Cloud Functions et Storage sur ta machine, uniquement quand tu compiles la cible preview avec le flag Dart USE_FIREBASE_EMULATOR=true (voir lib/core/firebase/firebase_emulator_wiring.dart). Les ports correspondent a firebase.json :
| Service | Port |
|---|---|
| Auth | 9099 |
| Firestore | 8080 |
| Functions | 5001 |
| Storage | 9199 |
| Emulator UI | 4000 |
Depuis la racine du repo, apres cd functions + npm install :
firebase emulators:startAvec sauvegarde de l’etat entre deux sessions (dossier local, a ne pas commiter tel quel si tu y mets des donnees sensibles) :
firebase emulators:start --import=.\emulator-data --export-on-exit=.\emulator-data- Sans
--import/--export-on-exit: au prochain arret des emulateurs, les donnees Firestore / Auth / Storage locales sont en general perdues (comportement par defaut en memoire). - Avec ces flags : un snapshot est ecrit dans
emulator-dataa la fermeture et recharge au demarrage suivant (creer le dossier ou faire un premier run avec export si besoin). Le depot ignoreemulator-data/etfirestore-debug.logdans.gitignorepour eviter des commits accidentels.
L’Emulator UI : http://127.0.0.1:4000/.
Exemple (Web) :
flutter run -d chrome -t lib/main_preview.dart --dart-define=USE_FIREBASE_EMULATOR=true --web-port=47432- Android emulateur : l’app utilise automatiquement l’hote
10.0.2.2pour joindre la machine (voirFirebaseEmulatorWiring). - Appareil physique : definir l’IP de ta machine, par exemple
--dart-define=FIREBASE_EMULATOR_HOST=192.168.1.10.
Si tu demarres seulement une partie des services, la CLI peut avertir que les appels vers les services non demarres (ex. Pub/Sub, Hosting, Realtime Database, etc.) peuvent encore partir vers la vraie infrastructure du projet configure dans firebase.json / FIREBASE_CONFIG. Verifie toujours le bandeau de demarrage et ne melange pas comptes / donnees prod par megarde.
Les extensions et le Pub/Sub emulateur ne sont pas dans la config courante : certaines fonctions planifiees (ex. cleanup dependant de Pub/Sub) peuvent etre ignorees en local tant que l’emulateur correspondant n’est pas lance.
firebase-debug.log(racine) : log CLI Firebase.firestore-debug.log: log de l’emulateur Firestore (souvent cree au demarrage Firestore).
Le runtime de l’emulateur Functions remplace admin.firestore par une fonction liee avec .bind(), ce qui fait disparaitre les proprietes statiques comme FieldValue sur admin.firestore. En consequence, le code des fonctions doit utiliser FieldValue via require('firebase-admin/firestore') (comme dans functions/index.js), sinon certains appels (ex. arrayUnion) echouent uniquement en emulateur alors que le deploy preview / prod fonctionne. Contexte detaille : conversation agent Cursor e687cf9b-cf83-417b-8ace-c912944da8d8.
Cette app utilise une Cloud Function pour generer les metadonnees de preview (linkPreview) a partir de trips/{tripId}.linkUrl.
- Projet Firebase en plan Blaze (obligatoire pour Cloud Functions gen2 en production).
- APIs Google Cloud activees (normalement proposees automatiquement au premier deploy):
- Cloud Functions API
- Cloud Build API
- Artifact Registry API
- Cloud Run API
- Eventarc API
- Etre connecte avec la Firebase CLI:
firebase login- Installer les dependances des fonctions:
cd functions
npm install
cd ..Depuis la racine du repo:
firebase deploy --only functions --project planerzAu premier deploy, Firebase peut demander une politique de retention des images de conteneur (Artifact Registry). Recommandation: 30 jours.
- Dans l'app, modifier un voyage et renseigner un
linkUrl. - Dans Firestore (
trips/{tripId}), verifier le champlinkPreview:status: "loading"puisstatus: "ok"(ouempty/error)- champs attendus:
title,description,siteName,imageUrl,fetchedAt
Si tu modifies functions/index.js:
firebase deploy --only functions --project planerzVoir le dossier docs/:
docs/product_scope.mddocs/firebase_data_model.mddocs/roadmap.md
- Gestion des participants et invitations
- Covoiturage (vehicules, places, trajets)
- Liste de courses collaborative
- Planning des repas
- Suivi des depenses et repartition
Ce projet est distribue sous licence GNU AGPL v3 (ou version ulterieure).
Voir le fichier LICENSE.