77 lines
2.8 KiB
Markdown
77 lines
2.8 KiB
Markdown
## Jetpack Compose : Améliorer la "skipabilité" d'une fonction pour réduire le nombre de recomposition inutile
|
||
|
||
### Identifiants
|
||
|
||
| V1 |
|
||
|:--:|
|
||
| 19 |
|
||
|
||
### 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.
|
||
|
||
Il peut être intéressant de mener ce genre d'analyse sur les fonctions Composable les plus riches d'une application.
|
||
|
||
### 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 à |
|
||
|-------------------------------------------------------------------------------------------|:-----------------------:|
|
||
| Fonctions Composables riches dans l'application dont la skipabilité n'a pas été optimisée | 40% |
|