⬅️ Retour au sommaire Flutter
flutter doctor affiche des ❌ sur Android toolchain → Ouvrez Android Studio → SDK Manager → installez la dernière plateforme et les Build-Tools, puis exécutez flutter doctor --android-licenses et acceptez toutes les licences.
flutter doctor
flutter doctor --android-licenses
flutter devices ne détecte pas mon téléphone Android → Vérifiez : (1) le débogage USB est activé, (2) vous avez accepté le popup d’autorisation sur l’écran du téléphone, (3) le câble USB supporte le transfert de données (pas seulement la charge), (4) essayez adb kill-server && adb start-server.
flutter devices
adb kill-server && adb start-server
Mon iPhone n’apparaît pas / erreur de signature Xcode → Ouvrez ios/Runner.xcworkspace (pas .xcodeproj) dans Xcode, sélectionnez votre Apple ID dans Signing & Capabilities, et sur l’iPhone : Réglages → Général → VPN et gestion de l’appareil → faites confiance au certificat développeur.
ios/Runner.xcworkspace
.xcodeproj
Erreur CocoaPods not installed (macOS)
CocoaPods not installed
sudo gem install cocoapods cd ios && pod install
SocketException: Connection refused ou timeout en appelant l’API depuis l’émulateur Android → Vous utilisez probablement localhost au lieu de 10.0.2.2. Voir Chapitre 4, section 2.
SocketException: Connection refused
localhost
10.0.2.2
Ça fonctionne sur l’émulateur mais pas sur mon téléphone physique → Vérifiez que : (1) le téléphone et le PC sont sur le même réseau Wifi, (2) vous utilisez l’IP locale du PC (192.168.x.x) et non 10.0.2.2 ni localhost, (3) le pare-feu de votre PC autorise le port 8080 en entrée, (4) Spring Boot écoute sur 0.0.0.0 (voir Annexe A) et non uniquement 127.0.0.1.
192.168.x.x
0.0.0.0
127.0.0.1
Erreur Cleartext HTTP traffic not permitted sur Android → Android bloque par défaut le HTTP non chiffré. Pour le développement, ajoutez dans android/app/src/main/AndroidManifest.xml :
Cleartext HTTP traffic not permitted
android/app/src/main/AndroidManifest.xml
<application android:usesCleartextTraffic="true" ...>
(À ne jamais faire en production : utilisez HTTPS.)
Erreur similaire sur iOS (App Transport Security) → Ajoutez dans ios/Runner/Info.plist :
App Transport Security
ios/Runner/Info.plist
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
FormatException: Unexpected character lors du jsonDecode → La réponse du serveur n’est pas du JSON valide (souvent une page d’erreur HTML 404/500 renvoyée par Spring). Affichez response.body dans la console pour diagnostiquer avant de parser.
FormatException: Unexpected character
jsonDecode
response.body
A RenderFlex overflowed by X pixels (dépassement d’écran) → Enveloppez le contenu dans un SingleChildScrollView, ou utilisez Expanded/Flexible dans un Row/Column, ou réduisez la taille du contenu.
A RenderFlex overflowed by X pixels
SingleChildScrollView
Expanded
Flexible
Row
Column
setState() called after dispose() → Un appel asynchrone tente de modifier l’état d’un widget déjà détruit (l’utilisateur a quitté l’écran avant la fin de l’appel). Toujours vérifier if (mounted) avant un setState() après un await.
setState() called after dispose()
if (mounted)
setState()
await
Deux FloatingActionButton (ou Hero) sur le même écran plantent l’app → Ajoutez un heroTag différent à chacun.
FloatingActionButton
Hero
heroTag
Le Hot Reload ne semble pas prendre en compte mes changements → Le Hot Reload ne fonctionne pas pour tous les types de changement (modification de main(), ajout de champs final, changement de type générique…). Faites un Hot Restart (R majuscule dans le terminal) ou relancez complètement flutter run.
main()
final
R
flutter run
Error: Could not find the correct Provider<X> above this Widget → Le ChangeNotifierProvider doit être un ancêtre du widget qui l’utilise dans l’arbre. Vérifiez qu’il est bien placé au-dessus (souvent dans main.dart) et non dans une branche parallèle de l’arbre.
Error: Could not find the correct Provider<X> above this Widget
ChangeNotifierProvider
main.dart
L’interface ne se met pas à jour après une modification du provider → Vérifiez que vous avez bien appelé notifyListeners() après la modification, et que le widget qui affiche la donnée utilise context.watch<T>() ou Consumer<T> (pas context.read<T>(), qui ne s’abonne pas aux changements).
notifyListeners()
context.watch<T>()
Consumer<T>
context.read<T>()
flutter build apk échoue avec une erreur de version Gradle/Java → Généralement lié à une incompatibilité entre la version du JDK et celle de Gradle. Mettez à jour Flutter (flutter upgrade) et Android Studio, qui synchronisent généralement les bonnes versions.
flutter build apk
flutter upgrade
L’application installée via APK release n’arrive pas à joindre l’API alors qu’elle fonctionnait en debug → Vérifiez que l’URL de l’API dans le code n’est pas 10.0.2.2 (spécifique à l’émulateur) mais bien l’IP réelle du serveur, joignable depuis le réseau où sera utilisé le téléphone.
Mon build iOS gratuit (compte Apple non payant) ne fonctionne plus après 7 jours → Comportement normal d’Apple pour les comptes développeur gratuits. Il faut soit réinstaller l’app depuis Xcode, soit passer à un compte développeur payant (99$/an) pour une distribution durable (TestFlight/App Store).