1. Élimination des Rebuilds Inutiles de l'Arbre de Widgets
Les reconstructions inutiles constituent la cause principale de saccades (jank) :
- Utiliser les Constructeurs `const` : Un widget `const` est instancié une seule fois à la compilation et n'est jamais recalculé lors des changements d'état.
- Isoler la Portée de l'État : N'appelez jamais `setState()` au niveau racine d'une vue complète. Extrayez les éléments dynamiques dans des sous-composants dédiés.
- Sélecteurs Fins : Utilisez `ref.watch(provider.select((s) => s.nom))` avec Riverpod ou `BlocSelector` avec BLoC pour ne reconstruire le widget que si la propriété observée change réellement.
// Exemple : Rebuild sélectif avec Riverpod
final userName = ref.watch(userProvider.select((user) => user.name));
return Text(userName); // Ne se reconstruit pas si l'email ou la photo change !
2. RepaintBoundary et Isolation des Couches Graphiques
Lorsqu'un élément s'anime, Flutter repeint par défaut tout l'arbre parent. En isolant le sous-arbre animé dans un RepaintBoundary, vous créez une couche GPU distincte qui protège le reste de la vue.
RepaintBoundary(
child: CustomPaint(
painter: AnimationVaguePainter(),
),
)
3. Décodage d'Images et Gestion Optimale de la Mémoire RAM
Charger des images 4K dans des vignettes de 60x60 pixels provoque des crashs mémoire OOM. Spécifiez systématiquement cacheWidth et cacheHeight pour ne décoder en mémoire que les pixels affichés :
Image.network(
imageUrl,
cacheWidth: 150,
cacheHeight: 150,
)
4. Traitements Lourds en Arrière-Plan avec les Isolates Dart
Le traitement de fichiers JSON volumineux sur le thread principal de l'UI fige l'affichage. Déportez les calculs lourds sur un thread secondaire grâce à Isolate.run() :
final resultat = await Isolate.run(() => parserGrosFichier(jsonBrut));