Scaffold é uma função composable no Jetpack Compose que implementa a estrutura básica de tela de acordo com a especificação Material Design. Scaffold fornece slots para TopAppBar, BottomBar, FloatingActionButton, Drawer e Snackbar. De acordo com Google Android Documentation, 2025, Scaffold é um elemento obrigatório para a maioria das telas em aplicativos Compose, pois gerencia as margens para os componentes do sistema Material Design.
Principais conclusões
Scaffold é uma função composable que implementa a estrutura de tela de acordo com a especificação Material Design. Scaffold não é um contêiner no sentido tradicional — é um gerenciador de layout que coordena o posicionamento de vários componentes padrão do Material na tela.
Scaffold gerencia margens para TopAppBar, BottomBar e FloatingActionButton, bem como elementos do sistema — barra de status e barra de navegação. Isso garante que o conteúdo não se sobreponha aos elementos do sistema e esteja em conformidade com as diretrizes do Material Design.
De acordo com Material Design Guidelines, 2025, Scaffold deve ser o elemento raiz de cada tela do aplicativo. Ele substitui o obsoleto CoordinatorLayout do sistema View e fornece uma API mais simples e declarativa para construir layouts de tela.
Scaffold aceita os parâmetros modifier, scaffoldState, topBar, bottomBar, floatingActionButton, drawerContent, snackbarHost e content. O parâmetro content recebe PaddingValues — as margens que o conteúdo principal deve considerar.
@Composable
fun BasicScaffold() {
Scaffold(
topBar = {
TopAppBar(
title = { Text("Início") }
)
},
floatingActionButton = {
FloatingActionButton(onClick = {}) {
Icon(Icons.Default.Add, contentDescription = "Add")
}
}
) { innerPadding ->
Column(
modifier = Modifier.padding(innerPadding)
) {
Text("Conteúdo principal")
}
}
}
topBar é o slot para colocar a barra superior do aplicativo, geralmente TopAppBar ou LargeTopAppBar. Scaffold adiciona automaticamente margens ao innerPadding para o conteúdo não se sobrepor ao topBar. TopAppBar pode conter um título, um ícone de navegação e ações.
bottomBar é o slot para a barra de navegação inferior. Suporta BottomNavigation, BottomAppBar ou NavigationBar. Scaffold leva em conta a altura do bottomBar ao calcular innerPadding para o conteúdo. De acordo com Material Design Guidelines, 2025, bottomBar deve ser usado em telas com 3–5 pontos de navegação.
floatingActionButton é o slot para o botão de ação flutuante. Scaffold posiciona automaticamente o FAB de acordo com a especificação Material Design — no canto inferior direito com margem correta. floatingActionButtonPosition permite mover o FAB para o centro da borda inferior da tela.
Neste exemplo, Scaffold usa todos os slots principais: TopAppBar com um título, BottomBar com três itens de navegação e FloatingActionButton para a ação principal.
@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, "Início") },
label = { Text("Home") },
selected = true,
onClick = {}
)
NavigationBarItem(
icon = { Icon(Icons.Default.Search, "Pesquisar") },
label = { Text("Search") },
selected = false,
onClick = {}
)
}
},
floatingActionButton = {
FloatingActionButton(onClick = {}) {
Icon(Icons.Default.Add, "Add")
}
}
) { innerPadding ->
Box(modifier = Modifier.padding(innerPadding)) {
Text("Conteúdo da tela")
}
}
}
ScaffoldState é o objeto de estado do Scaffold que combina DrawerState e SnackbarHostState. DrawerState gerencia a abertura e fechamento do menu lateral, enquanto SnackbarHostState gerencia a exibição e ocultação do Snackbar. O estado é criado através de rememberScaffoldState() e passado para o parâmetro scaffoldState.
DrawerState fornece métodos open e close para controle programático do Drawer. O estado do Drawer pode ser aberto, fechado ou parcialmente aberto. drawerGesturesEnabled permite desabilitar o gesto de deslizar para abrir o Drawer, deixando apenas a abertura programática através de um botão.
SnackbarHostState gerencia o Snackbar — notificações temporárias na parte inferior da tela. O método showSnackbar exibe um Snackbar com uma mensagem e uma ação opcional. De acordo com Material Design Guidelines, 2025, Snackbar deve ser usado para mensagens breves sem informações criticamente importantes.
@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("Item 1")
Text("Item 2")
}
}
) { innerPadding ->
Box(modifier = Modifier.padding(innerPadding)) {
Text("Conteúdo")
}
}
}
Um exemplo completo de tela com Scaffold inclui TopAppBar, BottomNavigation, FloatingActionButton e Snackbar para exibir notificações ao pressionar o FAB. ScaffoldState é passado para todos os componentes para coordenação de estado.
@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, "Início") },
label = { Text("Home") }, selected = true, onClick = {})
NavigationBarItem(icon = { Icon(Icons.Default.Settings, "Configurações") },
label = { Text("Settings") }, selected = false, onClick = {})
}
},
floatingActionButton = {
FloatingActionButton(onClick = {
scope.launch {
state.snackbarHostState.showSnackbar("Concluído")
}
}) {
Icon(Icons.Default.Add, "Add")
}
}
) { padding ->
Box(
modifier = Modifier.padding(padding).fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text("Bem-vindo")
}
}
}
innerPadding são os PaddingValues que Scaffold passa para o bloco content. Eles contêm as margens necessárias para evitar que o conteúdo se sobreponha a statusBar, navigationBar, topBar e bottomBar. O uso de innerPadding é obrigatório para exibição correta em diferentes dispositivos.
Scaffold calcula automaticamente innerPadding com base nas margens do sistema e na altura dos slots instalados. Em dispositivos com ilha de câmera ou recorte na tela, Scaffold ajusta as margens para a barra de status. Em dispositivos antigos com botões físicos, a margem inferior pode estar ausente.
De acordo com Android Developers, 2024, innerPadding deve ser aplicado ao contêiner raiz do conteúdo através de Modifier.padding(innerPadding). Se o conteúdo usar um contêiner rolável, innerPadding é aplicado através de Modifier.consumeWindowInsets para o funcionamento correto do teclado e gestos do sistema.
Perguntas frequentes
Scaffold não é um contêiner, mas um gerenciador de layout que controla slots para TopAppBar, BottomBar, FAB, Drawer e Snackbar, e também lida automaticamente com margens para componentes do sistema. Column e Box apenas posicionam elementos sem considerar Material Design.
Scaffold é recomendado para telas que usam componentes Material Design. Em telas simples sem TopAppBar, BottomBar ou FAB, Scaffold não é obrigatório, mas fornece margens corretas do sistema através de innerPadding, o que é útil mesmo sem slots.
Passe ScaffoldState para o parâmetro scaffoldState do Scaffold, então chame state.snackbarHostState.showSnackbar(“Mensagem”) dentro de uma corrotina. Scaffold exibirá automaticamente o Snackbar na parte inferior da tela.
Sim, Scaffold cria estado interno por padrão se scaffoldState não for passado. No entanto, para controlar programaticamente Drawer e Snackbar, você precisa criar e passar ScaffoldState através de rememberScaffoldState().
Use o parâmetro floatingActionButtonPosition do Scaffold. Por padrão, o FAB está localizado no canto inferior direito (FabPosition.End). Defina FabPosition.Center para colocar o FAB no centro da borda inferior da tela.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também