Aller au contenu

⬅️ Retour au sommaire Flutter

Annexe C — Résolution des problèmes courants (FAQ / Troubleshooting)

Environnement

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 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.

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.

Erreur CocoaPods not installed (macOS)

sudo gem install cocoapods
cd ios && pod install

Réseau / API

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.

Ç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.

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 :

<application android:usesCleartextTraffic="true" ...>

(À ne jamais faire en production : utilisez HTTPS.)

Erreur similaire sur iOS (App Transport Security) → Ajoutez dans 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.

Widgets / UI

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.

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.

Deux FloatingActionButton (ou Hero) sur le même écran plantent l’app → Ajoutez un heroTag différent à chacun.

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.

Provider

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.

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).

Build & déploiement

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.

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).

⬅️ Retour au sommaire Flutter