Ceci est une ancienne révision du document !
Table des matières
Tips, Tutos, Examples Flutter
Build optimisation
kDebugMode
kDebugMode étant un constante, le compilateur peut supprimer du code: Tree Shaking. Il faut donc l'utiliser pour réduire la taille de la compilation release.
J'ai vérifié en recherchant des chaînes de caractères dans app-release.apk/lib/x86_64/libapp.so : elles ne sont pas présentent si encapsulées dans un if( kDebugMode ){}
--split-debug-info
Pour compiler une release un peu plus légère
$ flutter build apk 23M app-release.apk # installed: 43.19 MB $ flutter build apk --split-debug-info=/tmp 22M app-release.apk # installed: 42.17 MB $ flutter build appbundle 42M app-release.aab $ flutter build appbundle --split-debug-info=/tmp 40M app-release.aab
Secret Data in App
On ne peut pas avoir de secret stocké dans l'App, c'est certain. 😉
Par contre on peut le cacher pour le rendre plus difficile à découvrir.
flutter build apk \ --release \ --obfuscate \ --split-debug-info=./debug_info \ --dart-define=API_URL=https://myapi.com \ --dart-define=API_KEY=super_secret_key
const apiUrl = String.fromEnvironment('API_URL'); const apiKey = String.fromEnvironment('API_KEY');
Mais dans la vraie vie on préférera mettre les secrets dans un fichier, en oubliant pas d'informer git de l'ignorer.
flutter build apk \ --release \ --obfuscate \ --split-debug-info=./debug_info \ --dart-define-from-file=config.prod.json
Et le fichier config.prod.json
{ "API_URL": "https://myapi.com", "API_KEY": "super_secret_key", "FEATURE_X": "true", "CLIENT_ID": "xyz-123" }
Notifications
Les notifications locales sont basées sur un tâche de fond périodique (Workmanager).
- La programmation de la tâche est faite au démarrage de l'App.
- Quand on tue l'App avec “Settings → Applications → MyApp → Force stop (Forcer l'arrêt)”, la programmation est annulée
- TODO confirmer (ou pas) qu'après un long temps sans utilisation de l'App et que le système la tue la programmation n'est pas conservée …
- Quand on reboot le device, la programmation est activée automatiquement, sans besoin de relancer l'App
Adaptative design
MediaQuery size
| Device | width | height |
|---|---|---|
| iPhone SE | 375.00 | 667.0 |
| Galaxy A41 | 411.43 | 866.29 |
| AVD small phone | 360.0 | 592.00 |
| AVD medium phone | 411.43 | 866.29 |
| AVD Pixel 8 Pro | 448.00 | 949.33 |
| AVD Pixel Tablet | 1280.00 | 800.00 |
ListView
Le conteneur du ListView doit pouvoir géré que la hauteur n'est pas connue à priori, voir le_rendu_plante_sans_rien_dans_la_debug_console.
Async
Différence entre Future et Microtask : Mastering Flutter Microtasks for Optimal Performance. En conclusion, dans l' Event loop la Microtask est prioritaire par rapport à la Future.
Play Store
Pour notamment:
- com.android.vending.CHECK_LICENSE
- Protection automatique désactivé
Voir aussi
- build option --split-debug-info
App Store Connect
testeurs externes
Les “testeurs externes” voient les nouvelles versions après plusieurs heures/jours, tant que le build est “En attente de vérification” il ne les voient pas … 😩
iOS dev
Codemagic.io
How to use remote access to Codemagic virtual MacOS build machine, la VM reste allumée 20 minutes. 🚀 500 minutes gratuites. 🍀
clients VNC : Remmina
Android dev
3 méthodes pour Android emulator access to local server. Le plus simple est d'utiliser https://10.0.2.2:3000.
network_security_config.xml
Pour avoir un network_security_config.xml personnalisé:
Dans AndroidManifest.xml
<manifest> <application ... android:networkSecurityConfig="@xml/network_security_config"> </application> </manifest>
Ensuite dans android/app/src/main/res/xml/network_security_config.xml, par exemple:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true"> <trust-anchors> <certificates src="system" /> <certificates src="user" /> </trust-anchors> </base-config> <domain-config cleartextTrafficPermitted="true"> <!-- for android emulator the 10.0.2.2 is our localhost 127.0.0.1 --> <domain includeSubdomains="true">10.0.2.2</domain> </domain-config> </network-security-config>

