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

Adaptative design

Adaptative design phone vs tablet vs desktop:

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

Voir Déploiement Play Console

Pour notamment:

Voir aussi

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 Remmina remote access

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>

https://codewithandrea.com/articles/flutter-deep-links/

List de tous les deep links (prefered apps) du système (émulateur) :

adb shell dumpsys package domain-preferred-apps

App Fingerprint

If you are using VS Code, open a terminal inside your project and then: