Scaffold dans Jetpack Compose — ce que c'est, propriétés et fonctionnement

Auteur : IT Sectr Publié le : 2026-06-29 Temps de lecture : 11 min

Scaffold est une fonction composable dans Jetpack Compose qui implémente la structure de base de l'écran selon la spécification Material Design. Scaffold fournit des emplacements pour TopAppBar, BottomBar, FloatingActionButton, Drawer et Snackbar. Selon Google Android Documentation, 2025, Scaffold est un élément obligatoire pour la plupart des écrans dans les applications Compose, car il gère les marges pour les composants système Material Design.

Points clés

  • Scaffold est une structure d'écran Material Design qui fournit des emplacements pour TopAppBar, BottomBar, FAB, Drawer et Snackbar avec des marges correctes.
  • ScaffoldState gère l'état de Drawer et Snackbar, permettant d'ouvrir et de fermer le menu latéral et d'afficher des notifications.
  • topBar, bottomBar et floatingActionButton sont des emplacements Scaffold pour intégrer les composants standard Material Design.
  • drawerGesturesEnabled contrôle le geste de balayage pour ouvrir le menu latéral, tandis que snackbarHost contrôle l'affichage personnalisé du Snackbar.
  • Scaffold gère automatiquement les marges pour la barre d'état et la barre de navigation via innerPadding.

Qu'est-ce que Scaffold dans Jetpack Compose

Scaffold est une fonction composable qui implémente la structure d'écran selon la spécification Material Design. Scaffold n'est pas un conteneur au sens traditionnel — c'est un gestionnaire de mise en page qui coordonne le placement de plusieurs composants Material standard sur l'écran.

Scaffold gère les marges pour TopAppBar, BottomBar et FloatingActionButton, ainsi que les éléments système — la barre d'état et la barre de navigation. Cela garantit que le contenu ne chevauche pas les éléments système et respecte les directives Material Design.

Selon Material Design Guidelines, 2025, Scaffold doit être l'élément racine de chaque écran d'application. Il remplace le CoordinatorLayout obsolète du système View et fournit une API plus simple et déclarative pour construire des mises en page d'écran.

Signature de base de Scaffold

Scaffold accepte les paramètres modifier, scaffoldState, topBar, bottomBar, floatingActionButton, drawerContent, snackbarHost et content. Le paramètre content reçoit PaddingValues — les marges que le contenu principal doit prendre en compte.

kotlin
@Composable
fun BasicScaffold() {
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text("Accueil") }
            )
        },
        floatingActionButton = {
            FloatingActionButton(onClick = {}) {
                Icon(Icons.Default.Add, contentDescription = "Add")
            }
        }
    ) { innerPadding ->
        Column(
            modifier = Modifier.padding(innerPadding)
        ) {
            Text("Contenu principal")
        }
    }
}

Emplacements Scaffold : topBar, bottomBar et floatingActionButton

topBar est l'emplacement pour placer la barre supérieure de l'application, généralement TopAppBar ou LargeTopAppBar. Scaffold ajoute automatiquement des marges à innerPadding pour que le contenu ne chevauche pas topBar. TopAppBar peut contenir un titre, une icône de navigation et des actions.

bottomBar est l'emplacement pour la barre de navigation inférieure. Il prend en charge BottomNavigation, BottomAppBar ou NavigationBar. Scaffold tient compte de la hauteur de bottomBar lors du calcul d'innerPadding pour le contenu. Selon Material Design Guidelines, 2025, bottomBar doit être utilisé sur les écrans avec 3 à 5 points de navigation.

floatingActionButton est l'emplacement pour le bouton d'action flottante. Scaffold positionne automatiquement le FAB selon la spécification Material Design — dans le coin inférieur droit avec une marge correcte. floatingActionButtonPosition permet de déplacer le FAB au centre du bord inférieur de l'écran.

Exemple avec tous les emplacements

Dans cet exemple, Scaffold utilise tous les emplacements principaux : TopAppBar avec un titre, BottomBar avec trois éléments de navigation et FloatingActionButton pour l'action principale.

kotlin
@Composable
fun FullScaffold() {
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text("App") },
                navigationIcon = {
                    IconButton(onClick = {}) {
                        Icon(Icons.Default.Menu, "Menu")
                    }
                }
            )
        },
        bottomBar = {
            NavigationBar {
                NavigationBarItem(
                    icon = { Icon(Icons.Default.Home, "Accueil") },
                    label = { Text("Home") },
                    selected = true,
                    onClick = {}
                )
                NavigationBarItem(
                    icon = { Icon(Icons.Default.Search, "Rechercher") },
                    label = { Text("Search") },
                    selected = false,
                    onClick = {}
                )
            }
        },
        floatingActionButton = {
            FloatingActionButton(onClick = {}) {
                Icon(Icons.Default.Add, "Add")
            }
        }
    ) { innerPadding ->
        Box(modifier = Modifier.padding(innerPadding)) {
            Text("Contenu de l'écran")
        }
    }
}

ScaffoldState : gestion de Drawer et Snackbar

ScaffoldState est l'objet d'état de Scaffold qui combine DrawerState et SnackbarHostState. DrawerState gère l'ouverture et la fermeture du menu latéral, tandis que SnackbarHostState gère l'affichage et le masquage du Snackbar. L'état est créé via rememberScaffoldState() et passé au paramètre scaffoldState.

DrawerState fournit des méthodes open et close pour le contrôle programmatique du Drawer. L'état du Drawer peut être ouvert, fermé ou partiellement ouvert. drawerGesturesEnabled permet de désactiver le geste de balayage pour ouvrir le Drawer, ne laissant que l'ouverture programmatique via un bouton.

SnackbarHostState gère le Snackbar — des notifications temporaires en bas de l'écran. La méthode showSnackbar affiche un Snackbar avec un message et une action facultative. Selon Material Design Guidelines, 2025, Snackbar doit être utilisé pour des messages brefs sans informations critiques.

kotlin
@Composable
fun ScaffoldWithDrawer() {
    val scaffoldState = rememberScaffoldState()
    val scope = rememberCoroutineScope()

    Scaffold(
        scaffoldState = scaffoldState,
        topBar = {
            TopAppBar(
                title = { Text("Menu") },
                navigationIcon = {
                    IconButton(onClick = {
                        scope.launch {
                            scaffoldState.drawerState.open()
                        }
                    }) {
                        Icon(Icons.Default.Menu, "Menu")
                    }
                }
            )
        },
        drawerContent = {
            Column(modifier = Modifier.padding(16.dp)) {
                Text("Élément 1")
                Text("Élément 2")
            }
        }
    ) { innerPadding ->
        Box(modifier = Modifier.padding(innerPadding)) {
            Text("Contenu")
        }
    }
}

Exemple de construction d'écran avec Scaffold

Un exemple complet d'écran avec Scaffold inclut TopAppBar, BottomNavigation, FloatingActionButton et Snackbar pour afficher des notifications lors de l'appui sur le FAB. ScaffoldState est passé à tous les composants pour la coordination de l'état.

kotlin
@Composable
fun MainScreen() {
    val state = rememberScaffoldState()
    val scope = rememberCoroutineScope()

    Scaffold(
        scaffoldState = state,
        topBar = {
            TopAppBar(
                title = { Text("IT Sectr") },
                actions = {
                    IconButton(onClick = {}) {
                        Icon(Icons.Default.Notifications, "Notifications")
                    }
                }
            )
        },
        bottomBar = {
            NavigationBar {
                NavigationBarItem(icon = { Icon(Icons.Default.Home, "Accueil") },
                    label = { Text("Home") }, selected = true, onClick = {})
                NavigationBarItem(icon = { Icon(Icons.Default.Settings, "Paramètres") },
                    label = { Text("Settings") }, selected = false, onClick = {})
            }
        },
        floatingActionButton = {
            FloatingActionButton(onClick = {
                scope.launch {
                    state.snackbarHostState.showSnackbar("Terminé")
                }
            }) {
                Icon(Icons.Default.Add, "Add")
            }
        }
    ) { padding ->
        Box(
            modifier = Modifier.padding(padding).fillMaxSize(),
            contentAlignment = Alignment.Center
        ) {
            Text("Bienvenue")
        }
    }
}

InnerPadding et mise en page adaptative avec Scaffold

innerPadding sont les PaddingValues que Scaffold passe au bloc content. Ils contiennent les marges nécessaires pour éviter que le contenu ne chevauche statusBar, navigationBar, topBar et bottomBar. L'utilisation d'innerPadding est obligatoire pour un affichage correct sur différents appareils.

Scaffold calcule automatiquement innerPadding en fonction des marges système et de la hauteur des emplacements installés. Sur les appareils avec îlot caméra ou découpe d'écran, Scaffold ajuste les marges pour la barre d'état. Sur les anciens appareils avec boutons physiques, la marge inférieure peut être absente.

Selon Android Developers, 2024, innerPadding doit être appliqué au conteneur racine du contenu via Modifier.padding(innerPadding). Si le contenu utilise un conteneur défilable, innerPadding est appliqué via Modifier.consumeWindowInsets pour le bon fonctionnement du clavier et des gestes système.

  • Appliquez innerPadding au conteneur racine du contenu via Modifier.padding(innerPadding)
  • Pour les conteneurs défilables, utilisez Modifier.consumeWindowInsets(innerPadding)
  • N'ajoutez pas de marges supplémentaires pour la barre d'état — Scaffold le fait automatiquement
  • Si topBar ou bottomBar est absent, les marges correspondantes dans innerPadding seront nulles

Questions fréquentes

En quoi Scaffold diffère-t-il d'un Column ou Box ordinaire ?

Scaffold n'est pas un conteneur mais un gestionnaire de mise en page qui contrôle les emplacements pour TopAppBar, BottomBar, FAB, Drawer et Snackbar, et gère automatiquement les marges pour les composants système. Column et Box positionnent uniquement les éléments sans tenir compte de Material Design.

Est-il obligatoire d'utiliser Scaffold sur chaque écran ?

Scaffold est recommandé pour les écrans qui utilisent des composants Material Design. Sur les écrans simples sans TopAppBar, BottomBar ou FAB, Scaffold n'est pas obligatoire, mais il fournit des marges système correctes via innerPadding, ce qui est utile même sans emplacements.

Comment afficher un Snackbar via Scaffold ?

Passez ScaffoldState au paramètre scaffoldState de Scaffold, puis appelez state.snackbarHostState.showSnackbar(“Message”) à l'intérieur d'une coroutine. Scaffold affichera automatiquement le Snackbar en bas de l'écran.

Puis-je utiliser Scaffold sans scaffoldState ?

Oui, Scaffold crée un état interne par défaut si scaffoldState n'est pas passé. Cependant, pour contrôler programmatiquement Drawer et Snackbar, vous devez créer et passer ScaffoldState via rememberScaffoldState().

Comment changer la position du FloatingActionButton dans Scaffold ?

Utilisez le paramètre floatingActionButtonPosition de Scaffold. Par défaut, le FAB se trouve en bas à droite (FabPosition.End). Définissez FabPosition.Center pour placer le FAB au centre du bord inférieur de l'écran.

Résumé

  • Scaffold est une structure d'écran Material Design avec gestion des emplacements pour TopAppBar, BottomBar, FAB, Drawer et Snackbar et marges système automatiques.
  • topBar, bottomBar et floatingActionButton sont des emplacements Scaffold pour intégrer des composants standard avec un positionnement correct.
  • ScaffoldState combine DrawerState et SnackbarHostState, offrant un contrôle programmatique du menu latéral et des notifications via des coroutines.
  • innerPadding est un paramètre obligatoire du bloc content, contenant les marges pour les éléments système et les emplacements installés de Scaffold.
  • drawerGesturesEnabled et floatingActionButtonPosition sont des paramètres supplémentaires pour affiner le comportement de Scaffold.
  • Scaffold gère automatiquement les marges pour la barre d'état et la barre de navigation sur les appareils avec différentes configurations d'écran.
  • Pour les écrans simples sans composants Material, Scaffold n'est pas obligatoire mais est recommandé comme élément racine pour une gestion correcte des marges système.

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi