## Jetpack Compose : Améliorer la "skipabilité" d'une fonction pour réduire le nombre de recomposition inutile ### Identifiants //TODO ### Catégories | Cycle de vie | Tiers | Responsable | |:---------:|:----:|:----:| | 3. Réalisation (fabrication / développement) | Utilisateur/Terminal | Architecte Logiciel/Développeur | ### Indications | Degré de priorité | Mise en oeuvre | Impact écologique | |:-------------------:|:-------------------------:|:---------------------:| | 4 | 4 | 4 | |Ressources Economisées | |:----------------------------------------------------------:| | Processeur | ### Description L'une des optimisations faites par Jetpack Compose : * Éviter le plus possible de recomposer un composant qui n’est pas impacté par un changement d’état. Pour cela, Jetpack Compose calcule la "skipabilité" d'une fonction, en évaluant d'abord la **stabilité de ses paramètres**. Stabilité des paramètres : * **Immutable** * **Stable** : Type mutable mais pour lequel Jetpack Compose sera notifié en cas de changement de l'une de ses propriétés publiques. * **Unstable** 3 situations typiques où Jetpack Compose ne peut pas définir une fonction comme `skippable` : 1. La propriété est mutable à cause d'une variable mutable déclarée avec `var` 2. La propriété est de type `List`, `Set` ou `Map`. En effet, ces types sont considérés comme unstable par Compose. 3. La propriété utilise un type provenant d'une dépendance externe. L'outil [Compose Compiler Report](https://developer.android.com/jetpack/compose/performance/stability/diagnose#compose-compiler) permet d'obtenir facilement un rapport analysant la stabilité des fonctions Composable d'un projet Android. ### Exemple Pour améliorer la "skipabilité" d'une fonction Composable et ainsi ne pas trop sollicité le processeur, il faut : 1. Utiliser `val` plutôt que `var`. 2. Utiliser `ImmutableList` (KotlinX) : ```shell dependencies { implementation("org.jetbrains.kotlinx:kotlinx-collections-immutable:${version}") } ``` 3. Marquer une data classe comme `@Immutable` si elle utilise un type provenant d'une dépendance externe ```kotlin @Immutable data class LogEntry { val timestamp: LocalDateTime, val log: String ) ``` ### Principe de validation | Le nombre ... | est inférieur ou égal à | |-------------------|:-------------------------:| | de modifications n'affectant pas le layout et occasionnant un repaint (ex: color, background, visibility) | 1 |