Scaffold — е composable функция в Jetpack Compose, която имплементира базовата структура на екрана според спецификацията Material Design. Scaffold предоставя слотове за TopAppBar, BottomBar, FloatingActionButton, Drawer и Snackbar. Според Google Android Documentation, 2025, Scaffold е задължителен елемент за повечето екрани в приложенията на Compose, тъй като управлява разстоянията за системните компоненти на Material Design.
Основни поенти
Scaffold — е composable функция, която имплементира рамката на екрана според спецификацията Material Design. Scaffold не е контейнер в обикновения смисъл — това е мениджър на означаването, който координира разположението на няколко стандартни Material компоненти на екрана.
Scaffold управлява разстоянията за TopAppBar, BottomBar и FloatingActionButton, както и системните елементи — лентата на състоянието и навигационния панел. Това гарантира, че съдържанието не припокрива системните елементи и е в съответствие с насоките на Material Design.
Според Material Design Guidelines, 2025, Scaffold трябва да бъде основен елемент на всеки екран на приложението. Той заменя остарялия CoordinatorLayout от системата View и предоставя по-прост и по-декларативен API за изграждане на означаването на екрана.
Scaffold приема параметри modifier, scaffoldState, topBar, bottomBar, floatingActionButton, drawerContent, snackbarHost и content. Параметърът content получава PaddingValues — разстоянията, които основното съдържание трябва да вземе предвид.
@Composable
fun BasicScaffold() {
Scaffold(
topBar = {
TopAppBar(
title = { Text("Начало") }
)
},
floatingActionButton = {
FloatingActionButton(onClick = {}) {
Icon(Icons.Default.Add, contentDescription = "Add")
}
}
) { innerPadding ->
Column(
modifier = Modifier.padding(innerPadding)
) {
Text("Основно съдържание")
}
}
}
topBar — слот за поставяне на горния панел на приложението, обикновено TopAppBar или LargeTopAppBar. Scaffold автоматично добавя разстояние в innerPadding за съдържанието, така че то да не припокрива topBar. TopAppBar може да съдържа заглавие, навигационна икона и действия.
bottomBar — слот за долния навигационен панел. Поддържа BottomNavigation, BottomAppBar или NavigationBar. Scaffold взема предвид височината на bottomBar при изчисляването на innerPadding за съдържанието. Според Material Design Guidelines, 2025, bottomBar трябва да се използва на екрани с 3–5 навигационни точки.
floatingActionButton — слот за плаващия бутон за действие. Scaffold автоматично позиционира FAB според спецификацията Material Design — в долния дясен ъгъл с правилно разстояние. floatingActionButtonPosition позволява преместване на FAB в центъра на долния праг на екрана.
В този пример Scaffold използва всички основни слотове: TopAppBar с заглавие, BottomBar с три навигационни елемента и FloatingActionButton за основното действие.
@Composable
fun FullScaffold() {
Scaffold(
topBar = {
TopAppBar(
title = { Text("Приложение") },
navigationIcon = {
IconButton(onClick = {}) {
Icon(Icons.Default.Menu, "Menu")
}
}
)
},
bottomBar = {
NavigationBar {
NavigationBarItem(
icon = { Icon(Icons.Default.Home, "Начало") },
label = { Text("Home") },
selected = true,
onClick = {}
)
NavigationBarItem(
icon = { Icon(Icons.Default.Search, "Търсене") },
label = { Text("Search") },
selected = false,
onClick = {}
)
}
},
floatingActionButton = {
FloatingActionButton(onClick = {}) {
Icon(Icons.Default.Add, "Add")
}
}
) { innerPadding ->
Box(modifier = Modifier.padding(innerPadding)) {
Text("Съдържание на екрана")
}
}
}
ScaffoldState — обект на състоянието на Scaffold, който обединява DrawerState и SnackbarHostState. DrawerState управлява отварянето и затварянето на страничното меню, а SnackbarHostState — показването и скриването на Snackbar. Състоянието се създава чрез rememberScaffoldState() и се предава на параметъра scaffoldState.
DrawerState предоставя методите open и close за програмно управление на Drawer. Състоянието на Drawer може да бъде отворено, затворено или частично отворено. drawerGesturesEnabled позволява изключване на жеста за отваряне на Drawer чрез плъзгане, оставяйки само програмното отваряне чрез бутон.
SnackbarHostState управлява Snackbar — временни известия в долната част на екрана. Методът showSnackbar показва Snackbar със съобщение и опционално действие. Според Material Design Guidelines, 2025, Snackbar трябва да се използва за кратки съобщения без критично важна информация.
@Composable
fun ScaffoldWithDrawer() {
val scaffoldState = rememberScaffoldState()
val scope = rememberCoroutineScope()
Scaffold(
scaffoldState = scaffoldState,
topBar = {
TopAppBar(
title = { Text("Меню") },
navigationIcon = {
IconButton(onClick = {
scope.launch {
scaffoldState.drawerState.open()
}
}) {
Icon(Icons.Default.Menu, "Menu")
}
}
)
},
drawerContent = {
Column(modifier = Modifier.padding(16.dp)) {
Text("Елемент 1")
Text("Елемент 2")
}
}
) { innerPadding ->
Box(modifier = Modifier.padding(innerPadding)) {
Text("Съдържание")
}
}
}
Пълен пример на екран с Scaffold включва TopAppBar, BottomNavigation, FloatingActionButton и Snackbar за показване на известия при натискане на FAB. ScaffoldState се предава на всички компоненти за координация на състоянието.
@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, "Начало") },
label = { Text("Home") }, selected = true, onClick = {})
NavigationBarItem(icon = { Icon(Icons.Default.Settings, "Настройки") },
label = { Text("Settings") }, selected = false, onClick = {})
}
},
floatingActionButton = {
FloatingActionButton(onClick = {
scope.launch {
state.snackbarHostState.showSnackbar("Готово")
}
}) {
Icon(Icons.Default.Add, "Add")
}
}
) { padding ->
Box(
modifier = Modifier.padding(padding).fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text("Добре дошли")
}
}
}
innerPadding — са PaddingValues, които Scaffold предава на content блока. Те съдържат разстоянията, необходими за да не се припокриват statusBar, navigationBar, topBar и bottomBar. Използването на innerPadding е задължително за правилно показване на различни устройства.
Scaffold автоматично изчислява innerPadding на базата на системните разстояния и височината на инсталираните слотове. На устройства с остров на камерата или изрез на екрана, Scaffold коригира разстоянията за лентата на състоянието. На по-стари устройства с физически бутони, долното разстояние може да бъде нула.
Според Android Developers, 2024, innerPadding трябва да се прилага към основния контейнер на съдържанието чрез Modifier.padding(innerPadding). Ако съдържанието използва превитаем контейнер, innerPadding се прилага чрез Modifier.consumeWindowInsets за правилната работа на клавиатурата и системните жестове.
Често задавани въпроси
Scaffold не е контейнер, а мениджър на означаването, който управлява слотовете за TopAppBar, BottomBar, FAB, Drawer и Snackbar и автоматично обработва разстоянията за системните компоненти. Column и Box просто разполагат елементите без да вземат предвид Material Design.
Scaffold се препоръчва за екрани, които използват компоненти на Material Design. На прости екрани без TopAppBar, BottomBar или FAB, Scaffold не е задължителен, но осигурява правилни системни разстояния чрез innerPadding, което е полезно дори и без слотове.
Предайте ScaffoldState на параметъра scaffoldState на Scaffold, след което извикайте state.snackbarHostState.showSnackbar(„Съобщение”) внутре на корутина. Scaffold автоматично ще покаже Snackbar в долната част на екрана.
Да, Scaffold създава подразбираемо вътрешно състояние, ако scaffoldState не е предаден. Въпреки това, за програмно управление на Drawer и Snackbar, трябва да създадете и предадете ScaffoldState чрез rememberScaffoldState().
Използвайте параметъра floatingActionButtonPosition на Scaffold. По подразбиране FAB е долу вдясно (FabPosition.End). Настройте FabPosition.Center, за да поставите FAB в центъра на долния праг на екрана.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също