Compose syntaxe, les subtilités
Facile : fonctions en majuscule
Les fonctions Composable commencent par une majuscule, contrairement aux conventions de nommage en Kotlin où les fonctions commencent par une minuscule.
- Convention juste pour compose
- C'est une contradiction avec les conventions Kotlin
- Pourrait nous mélanger avec des appels de constructeur
- Row() est un appel de compose
- Random() est un appel de constructeur
Ce sont bien des fonctions en compose.
Intermédiaire : Syntaxe des appels de fonctions Compose
- Dans un appel fonction classique, on a des () : maFonction(5, 6)
- En kotlin, si le dernier paramètre est une lambda, on peut la déporter après les parenthèses
- On appelle ça une trailing lambda
Exemple
Voici deux façons équivalentes d'utiliser un composant Row :
// Utilisation du trailing lambda
Row {
Column { /* contenu */ }
Column { /* contenu */ }
}
// Lambda passé dans les parenthèses
Row(content = {
Column { /* contenu */ }
Column { /* contenu */ }
})
- Le contenu de la Row est défini par une lambda
- La syntaxe diffère selon la position du bloc
- Juste la dernière lambda peut être déportée
Code source de Column
@Composable
inline fun Column(
modifier: Modifier = Modifier,
verticalArrangement: Arrangement.Vertical = Arrangement.Top,
horizontalAlignment: Alignment.Horizontal = Alignment.Start,
content: @Composable ColumnScope.() -> Unit
) {
val measurePolicy = columnMeasurePolicy(verticalArrangement, horizontalAlignment)
Layout(
content = { ColumnScopeInstance.content() },
measurePolicy = measurePolicy,
modifier = modifier
)
}
Difficile : le Modifier
modifier
permet de chaîner plusieurs transformations ou décorations sur un composant.- Chaque appel à une fonction comme
padding
,background
,fillMaxWidth
, etc., retourne un nouvel objetModifier
- Ça permet de les enchaîner facilement.
Ce mécanisme repose sur le patron de conception Chain of Responsibility (chaîne de responsabilité), où chaque transformation modifie ou enrichit le comportement du composant.
Exemple d'utilisation de Modifier
Row(
modifier = Modifier
.padding(8.dp)
.background(Color.LightGray)
.fillMaxWidth()
) {
// contenu
}
Dans cet exemple, le Row
aura un padding de 8dp, un fond gris clair et prendra toute la largeur disponible. Chaque appel retourne un nouveau Modifier
enrichi, permettant de composer facilement plusieurs effets.
God mode : gestion de l'état avec remember
En Jetpack Compose, la fonction remember
permet de conserver une valeur en mémoire à travers les recompositions d'une fonction composable. Cela signifie que la valeur stockée avec remember
ne sera pas réinitialisée à chaque fois que la fonction est réévaluée, sauf si les clés de dépendance changent ou si le composant est retiré de la composition.
remember
est souvent utilisé pour stocker l'état local d'un composant, comme une variable qui doit survivre aux changements d'interface mais rester propre à la composable.
Exemple d'utilisation de remember
@Composable
fun Compteur() {
var count by remember { mutableStateOf(0) }
Button(onClick = { count++ }) {
Text("Compteur : $count")
}
}
Dans cet exemple, la variable count
est conservée grâce à remember
. À chaque clic, la valeur est incrémentée et l'interface se met à jour, mais la valeur n'est pas perdue lors des recompositions.
Références :
Exercices
Ouvrez le projet WhatTheCompose dans Intellij, il s'agit d'un projet en pur Kotlin.
Exercice Lambda
Pour se familiariser avec les lambda, ouvrez le fichier A-Lambdas.kt.
Rajouter:
- dans la fonction
main
- crée un tableau avec les valeurs 5, 55, -12, 2034
- un appel à triBulle
- qui trie le tableau du nombre le plus court au nombre le plus long au sens du nombre de chiffres
- par exemple "-12" (3 chiffres) est plus long que "55" (2 chiffres) donc sera après dans le tableau trié
Exercice lambda déportée
Se familiariser avec les trailing lambdas, ouvrez le fichier B-TrailingLambda.kt.
Exercice Café modifié
Ouvrez le fichier C-Modifier-Voodoo-Magic.kt.
- placer quelques points d'arrêts et regarder ce que fait chaque modification
- essayer d'ajouter une fonction pour mettre une vanilleFrançaise dans le café