Jetpack Compose : mise en pratique et concepts clés

Intégration de Jetpack Compose dans un projet

Pour commencer avec Compose, assurez-vous d'utiliser Android Studio comme environnement de développement. La version la plus récente génère par défaut des projets compatibles Compose.

Création d'une nouvelle application compatible Compose

Lors de la création d'un nouveau projet, sélectionnez Kotlin comme langage, car Jetpack Compose est exclusivement conçu pour Kotlin. Le niveau d'API minimum recommandé est 21 ou supérieur.

Configuration de Compose pour une application existante

Pour intégrer Compose dans un projet Android existant, ajoutez les configurations suviantes dans le fichier build.gradle :

android {
    buildFeatures {
        compose = true
    }

    composeOptions {
        kotlinCompilerExtensionVersion = "1.5.9"
    }
}

L'activation de la fonctionnalité compose permet le support de l'UI déclarative. La version de l'extension du compiltaeur doit correspondre à la version de Kotlin utilisée.

Ajout des dépendances nécessaires

Les dépendances typiques pour un projet Compe incluent :

dependencies {
    val composeBill = platform("androidx.compose:compose-bom:2024.02.01")
    implementation(composeBill)
    androidTestImplementation(composeBill)

    // Composants Material Design 3
    implementation("androidx.compose.material3:material3")
    // Outils de prévisualisation
    implementation("androidx.compose.ui:ui-tooling-preview")
    debugImplementation("androidx.compose.ui:ui-tooling")
    // Intégration avec les activités et les ViewModels
    implementation("androidx.activity:activity-compose:1.8.2")
    implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1")
}

Un exemple de base généré automatiquement :

class EcranPrincipal : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ThemeApplication {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    MessageAccueil("Android")
                }
            }
        }
    }
}

@Composable
fun MessageAccueil(nom: String) {
    Texte("Bonjour, $nom!")
}

@Preview(showBackground = true)
@Composable
fun ApercuMessageAccueil() {
    ThemeApplication {
        MessageAccueil("Android")
    }
}

Principes de conception de l'API Compose

Tout est fonction

L'UI dans Compose est construite à l'aide de fonctions composible, annotées avec @Composable. Ces fonctions prennent des données en entrée et génèrent des éléments d'interface. Par exemple :

@Composable
fun Salutation(utilisateur: String) {
    Texte("Bienvenue, $utilisateur")
}

Les fonctions composable doivent être appelées dans le contexte d'autres fonctions composable. L'exécution répétée de ces fonctions permet de mettre à jour l'arborescence de l'interface, un processus appelé recomposition.

Composition plutôt qu'héritage

Les composants Compose sont conçus pour être assemblés plutôt que dérivés par héritage. Par exemple, un bouton avec du texte est créé en combinant un Bouton et un Texte :

Column {
    MessageAccueil("Utilisateur")
    BoutonClickable(onClick = { /* Action */ }) {
        Texte("Cliquez ici")
    }
}

Cette approche favorise la réutilisation et la modularité, évitant les problèmes de composition tels que les composants surchargés.

Source unique de données

Les composants d'entrée, comme ChampTexte, suivent le principe d'une source de données unique. L'état contrôlé garantit que l'interface reflète systématiquement les données :

var contenuTexte by remember { mutableStateOf("") }
ChampTexte(
    value = contenuTexte,
    onValueChange = { nouveauContenu ->
        contenuTexte = nouveauContenu
    }
)

Seule la variable contenuTexte détermine l'affichage, et les modifications sont gérées via des rappels.

Interopérabilité entre Compose et les Views traditionnelles

Utilisation de Views dans Compose

Pour intégrer des composants View dans Compose, utilisez VueAndroid :

@Composable
fun TexteLegacy(texte: String) {
    VueAndroid(
        fabrique = { contexte ->
            TextView(contexte).apply {
                setText(texte)
            }
        },
        miseAJour = { vue ->
            vue.setText(texte)
        }
    )
}

Cette fonction agit comme un pont, créant et mettant à jour les vues traditionnelles.

Réutilisation de layouts XML dans Compose

Pour intégrer des layouts XML existants, activez le ViewBinding et utilisez LiaisonVueAndroid :

@Composable
fun DispositionPersonnalisee() {
    LiaisonVueBinding(LayoutTestBinding::inflate) {
        boutonTest.setOnClickListener {
            // Gestion des clics
        }
    }
}

Intégration de Compose dans des Views

Pour ajouter du contenu Compose dans une interface traditionnelle, utilisez VueCompose :

<androidx.compose.ui.platform.ComposeView
    android:id="@+id/vue_compose"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

// Dans le code Kotlin
findViewById<VueCompose>(R.id.vue_compose).setContent {
    Texte("Contenu Compose")
}

Cette approche permet une migration progressive entre les systèmes d'interface.

Étiquettes: Jetpack Compose kotlin Android UI déclarative Compose API

Publié le 1 juillet à 04h19