Scaffold в Jetpack Compose — какво е, свойства и как работи

Автор: IT Sectr Публикувано: 2026-06-29 Време за четене: 11 мин

Scaffold — е composable функция в Jetpack Compose, която имплементира базовата структура на екрана според спецификацията Material Design. Scaffold предоставя слотове за TopAppBar, BottomBar, FloatingActionButton, Drawer и Snackbar. Според Google Android Documentation, 2025, Scaffold е задължителен елемент за повечето екрани в приложенията на Compose, тъй като управлява разстоянията за системните компоненти на Material Design.

Основни поенти

  • Scaffold — рамка на екрана Material Design, която предоставя слотове за TopAppBar, BottomBar, FAB, Drawer и Snackbar с правилни разстояния.
  • ScaffoldState управлява състоянието на Drawer и Snackbar, осигурявайки отварянето и затварянето на страничното меню и показването на известия.
  • topBar, bottomBar и floatingActionButton — слотове на Scaffold за интеграция на стандартните компоненти на Material Design.
  • drawerGesturesEnabled управлява жеста за отваряне на страничното меню, а snackbarHost — персонализираното показване на Snackbar.
  • Scaffold автоматично управлява разстоянията за лентата на състоянието и навигационния панел чрез innerPadding.

Какво е Scaffold в Jetpack Compose

Scaffold — е composable функция, която имплементира рамката на екрана според спецификацията Material Design. Scaffold не е контейнер в обикновения смисъл — това е мениджър на означаването, който координира разположението на няколко стандартни Material компоненти на екрана.

Scaffold управлява разстоянията за TopAppBar, BottomBar и FloatingActionButton, както и системните елементи — лентата на състоянието и навигационния панел. Това гарантира, че съдържанието не припокрива системните елементи и е в съответствие с насоките на Material Design.

Според Material Design Guidelines, 2025, Scaffold трябва да бъде основен елемент на всеки екран на приложението. Той заменя остарялия CoordinatorLayout от системата View и предоставя по-прост и по-декларативен API за изграждане на означаването на екрана.

Основен подпис на Scaffold

Scaffold приема параметри modifier, scaffoldState, topBar, bottomBar, floatingActionButton, drawerContent, snackbarHost и content. Параметърът content получава PaddingValues — разстоянията, които основното съдържание трябва да вземе предвид.

kotlin
@Composable
fun BasicScaffold() {
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text("Начало") }
            )
        },
        floatingActionButton = {
            FloatingActionButton(onClick = {}) {
                Icon(Icons.Default.Add, contentDescription = "Add")
            }
        }
    ) { innerPadding ->
        Column(
            modifier = Modifier.padding(innerPadding)
        ) {
            Text("Основно съдържание")
        }
    }
}

Слотове на Scaffold: topBar, bottomBar и floatingActionButton

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 за основното действие.

kotlin
@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: управление на Drawer и Snackbar

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 трябва да се използва за кратки съобщения без критично важна информация.

kotlin
@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

Пълен пример на екран с Scaffold включва TopAppBar, BottomNavigation, FloatingActionButton и Snackbar за показване на известия при натискане на FAB. ScaffoldState се предава на всички компоненти за координация на състоянието.

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, "Начало") },
                    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 и адаптивен лаяут с Scaffold

innerPadding — са PaddingValues, които Scaffold предава на content блока. Те съдържат разстоянията, необходими за да не се припокриват statusBar, navigationBar, topBar и bottomBar. Използването на innerPadding е задължително за правилно показване на различни устройства.

Scaffold автоматично изчислява innerPadding на базата на системните разстояния и височината на инсталираните слотове. На устройства с остров на камерата или изрез на екрана, Scaffold коригира разстоянията за лентата на състоянието. На по-стари устройства с физически бутони, долното разстояние може да бъде нула.

Според Android Developers, 2024, innerPadding трябва да се прилага към основния контейнер на съдържанието чрез Modifier.padding(innerPadding). Ако съдържанието използва превитаем контейнер, innerPadding се прилага чрез Modifier.consumeWindowInsets за правилната работа на клавиатурата и системните жестове.

  • Приложете innerPadding към основния контейнер на съдържанието чрез Modifier.padding(innerPadding)
  • За превитаеми контейнери използвайте Modifier.consumeWindowInsets(innerPadding)
  • Не добавяйте допълнителни разстояния за лентата на състоянието — Scaffold прави това автоматично
  • При липса на topBar или bottomBar, съответните разстояния в innerPadding ще бъдат нула

Често задавани въпроси

С какво се различава Scaffold от обикновения Column или Box?

Scaffold не е контейнер, а мениджър на означаването, който управлява слотовете за TopAppBar, BottomBar, FAB, Drawer и Snackbar и автоматично обработва разстоянията за системните компоненти. Column и Box просто разполагат елементите без да вземат предвид Material Design.

Задължително ли е да се използва Scaffold на всеки екран?

Scaffold се препоръчва за екрани, които използват компоненти на Material Design. На прости екрани без TopAppBar, BottomBar или FAB, Scaffold не е задължителен, но осигурява правилни системни разстояния чрез innerPadding, което е полезно дори и без слотове.

Как да покажа Snackbar чрез Scaffold?

Предайте ScaffoldState на параметъра scaffoldState на Scaffold, след което извикайте state.snackbarHostState.showSnackbar(„Съобщение”) внутре на корутина. Scaffold автоматично ще покаже Snackbar в долната част на екрана.

Мога ли да използвам Scaffold без scaffoldState?

Да, Scaffold създава подразбираемо вътрешно състояние, ако scaffoldState не е предаден. Въпреки това, за програмно управление на Drawer и Snackbar, трябва да създадете и предадете ScaffoldState чрез rememberScaffoldState().

Как да променя позицията на FloatingActionButton в Scaffold?

Използвайте параметъра floatingActionButtonPosition на Scaffold. По подразбиране FAB е долу вдясно (FabPosition.End). Настройте FabPosition.Center, за да поставите FAB в центъра на долния праг на екрана.

Резюме

  • Scaffold — рамка на екрана Material Design с управление на слотовете за TopAppBar, BottomBar, FAB, Drawer и Snackbar и автоматични системни разстояния.
  • topBar, bottomBar и floatingActionButton — слотове на Scaffold за интеграция на стандартни компоненти с правилно позициониране.
  • ScaffoldState обединява DrawerState и SnackbarHostState, осигурявайки програмно управление на страничното меню и известията чрез корутини.
  • innerPadding — задължителен параметър на content блока, съдържащ разстояния за системните елементи и инсталираните слотове на Scaffold.
  • drawerGesturesEnabled и floatingActionButtonPosition — допълнителни параметри за фино настрояване на поведението на Scaffold.
  • Scaffold автоматично обработва разстоянията за лентата на състоянието и навигационния панел на устройства с различни конфигурации на екрана.
  • За прости екрани без Material компоненти, Scaffold не е задължителен, но се препоръчва като основен елемент за правилната работа на системните разстояния.

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също