73 lines
2.5 KiB
Markdown
73 lines
2.5 KiB
Markdown
|
## 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 |
|