Scaffold v Jetpack Compose — co to je, vlastnosti a jak funguje

Autor: IT Sectr Publikováno: 2026-06-29 Doba čtení: 11 min

Scaffold — je funkce composable v Jetpack Compose, která implementuje základní strukturu obrazovky podle specifikace Material Design. Scaffold poskytuje sloty pro TopAppBar, BottomBar, FloatingActionButton, Drawer a Snackbar. Podle Google Android Documentation, 2025 je Scaffold povinným prvkem většiny obrazovek v aplikacích na Compose, protože řídí mezery pro systémové komponenty Material Design.

Hlavní body

  • Scaffold — kostra obrazovky Material Design, která poskytuje sloty pro TopAppBar, BottomBar, FAB, Drawer a Snackbar se správnými mezerami.
  • ScaffoldState řídí stav Drawer a Snackbar, zajišťuje otevírání a zavírání postranní nabídky a zobrazování oznámení.
  • topBar, bottomBar a floatingActionButton — sloty Scaffold pro integraci standardních komponent Material Design.
  • drawerGesturesEnabled řídí gesto otevírání postranní nabídky a snackbarHost vlastní zobrazení Snackbar.
  • Scaffold automaticky řídí mezery pro stavový řádek a navigační panel pomocí innerPadding.

Co je Scaffold v Jetpack Compose

Scaffold — je funkce composable, která implementuje kostru obrazovky podle specifikace Material Design. Scaffold není kontejner v běžném smyslu — je to správce rozvržení, který koordinuje umístění několika standardních komponent Material na obrazovce.

Scaffold řídí mezery pro TopAppBar, BottomBar a FloatingActionButton, stejně jako systémové prvky — stavový řádek a navigační panel. To zaručuje, že obsah nepřekrývá systémové prvky a je v souladu s pokyny Material Design.

Podle Material Design Guidelines, 2025 by měl být Scaffold kořenovým prvkem každé obrazovky aplikace. Nahrazuje zastaralý CoordinatorLayout ze systému View a poskytuje jednodušší a deklarativnější API pro stavbu rozvržení obrazovky.

Základní signatura Scaffold

Scaffold přijímá parametry modifier, scaffoldState, topBar, bottomBar, floatingActionButton, drawerContent, snackbarHost a content. Parametr content obdrží PaddingValues — mezery, které musí hlavní obsah zohlednit.

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

Sloty Scaffold: topBar, bottomBar a floatingActionButton

topBar — slot pro umístění horního panelu aplikace, obvykle TopAppBar nebo LargeTopAppBar. Scaffold automaticky přidá mezeru do innerPadding pro obsah, aby nepřekrýval topBar. TopAppBar může obsahovat název, navigační ikonu a akce.

bottomBar — slot pro dolní navigační panel. Podporuje BottomNavigation, BottomAppBar nebo NavigationBar. Scaffold bere v úvahu výšku bottomBar při výpočtu innerPadding pro obsah. Podle Material Design Guidelines, 2025 by se bottomBar měl používat na obrazovkách se 3–5 navigačními body.

floatingActionButton — slot pro plovoucí tlačítko akce. Scaffold automaticky umístí FAB podle specifikace Material Design — v pravém dolním rohu se správnou mezerou. floatingActionButtonPosition umožňuje přesunout FAB do středu spodního okraje obrazovky.

Příklad se všemi sloty

V tomto příkladu Scaffold používá všechny hlavní sloty: TopAppBar s názvem, BottomBar se třemi navigačními prvky a FloatingActionButton pro hlavní akci.

kotlin
@Composable
fun FullScaffold() {
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text("Aplikace") },
                navigationIcon = {
                    IconButton(onClick = {}) {
                        Icon(Icons.Default.Menu, "Menu")
                    }
                }
            )
        },
        bottomBar = {
            NavigationBar {
                NavigationBarItem(
                    icon = { Icon(Icons.Default.Home, "Domů") },
                    label = { Text("Home") },
                    selected = true,
                    onClick = {}
                )
                NavigationBarItem(
                    icon = { Icon(Icons.Default.Search, "Hledat") },
                    label = { Text("Search") },
                    selected = false,
                    onClick = {}
                )
            }
        },
        floatingActionButton = {
            FloatingActionButton(onClick = {}) {
                Icon(Icons.Default.Add, "Add")
            }
        }
    ) { innerPadding ->
        Box(modifier = Modifier.padding(innerPadding)) {
            Text("Obsah obrazovky")
        }
    }
}

ScaffoldState: správa Drawer a Snackbar

ScaffoldState — objekt stavu Scaffold, který spojuje DrawerState a SnackbarHostState. DrawerState řídí otevírání a zavírání postranní nabídky a SnackbarHostState zobrazování a skrývání Snackbar. Stav se vytváří pomocí rememberScaffoldState() a předává se parametru scaffoldState.

DrawerState poskytuje metody open a close pro programové řízení Drawer. Stav Drawer může být otevřený, zavřený nebo částečně otevřený. drawerGesturesEnabled umožňuje zakázat gesto otevírání Drawer tažením, ponechat pouze programové otevírání tlačítkem.

SnackbarHostState řídí Snackbar — dočasná oznámení ve spodní části obrazovky. Metoda showSnackbar zobrazí Snackbar se zprávou a volitelnou akcí. Podle Material Design Guidelines, 2025 by se Snackbar měl používat pro krátké zprávy bez kriticky důležitých informací.

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("Položka 1")
                Text("Položka 2")
            }
        }
    ) { innerPadding ->
        Box(modifier = Modifier.padding(innerPadding)) {
            Text("Obsah")
        }
    }
}

Příklad stavby obrazovky se Scaffold

Úplný příklad obrazovky se Scaffold zahrnuje TopAppBar, BottomNavigation, FloatingActionButton a Snackbar pro zobrazení oznámení při stisku FAB. ScaffoldState je předán všem komponentám pro koordinaci stavu.

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, "Domů") },
                    label = { Text("Home") }, selected = true, onClick = {})
                NavigationBarItem(icon = { Icon(Icons.Default.Settings, "Nastavení") },
                    label = { Text("Settings") }, selected = false, onClick = {})
            }
        },
        floatingActionButton = {
            FloatingActionButton(onClick = {
                scope.launch {
                    state.snackbarHostState.showSnackbar("Hotovo")
                }
            }) {
                Icon(Icons.Default.Add, "Add")
            }
        }
    ) { padding ->
        Box(
            modifier = Modifier.padding(padding).fillMaxSize(),
            contentAlignment = Alignment.Center
        ) {
            Text("Vítejte")
        }
    }
}

InnerPadding a adaptivní layout se Scaffold

innerPadding — jsou PaddingValues, které Scaffold předává do content bloku. Obsahují mezery nezbytné k tomu, aby obsah nepřekrýval statusBar, navigationBar, topBar a bottomBar. Použití innerPadding je povinné pro správné zobrazení na různých zařízeních.

Scaffold automaticky vypočítává innerPadding na základě systémových mezer a výšky nainstalovaných slotů. Na zařízeních s kamerovým ostrovem nebo výřezem v obrazovce Scaffold upravuje mezery pro stavový řádek. Na starších zařízeních s fyzickými tlačítky může být spodní mezera nulová.

Podle Android Developers, 2024 by měl být innerPadding aplikován na kořenový kontejner obsahu pomocí Modifier.padding(innerPadding). Pokud obsah používá posouvání kontejner, innerPadding se aplikuje pomocí Modifier.consumeWindowInsets pro správnou funkci klávesnice a systémových gest.

  • Aplikujte innerPadding na kořenový kontejner obsahu pomocí Modifier.padding(innerPadding)
  • Pro posouvací kontejnery použijte Modifier.consumeWindowInsets(innerPadding)
  • Nepřidávejte další mezery pro stavový řádek — Scaffold to dělá automaticky
  • Při absenci topBar nebo bottomBar budou odpovídající mezery v innerPadding nulové

Často kladené otázky

Čím se Scaffold liší od běžného Column nebo Box?

Scaffold není kontejner, ale správce rozvržení, který řídí sloty pro TopAppBar, BottomBar, FAB, Drawer a Snackbar a automaticky zpracovává mezery pro systémové komponenty. Column a Box pouze umístťují prvky bez ohledu na Material Design.

Je použití Scaffold na každé obrazovce povinné?

Scaffold je doporučen pro obrazovky používající komponenty Material Design. Na jednoduchých obrazovkách bez TopAppBar, BottomBar nebo FAB není Scaffold povinný, ale poskytuje správné systémové mezery pomocí innerPadding, což je užitečné i bez slotů.

Jak zobrazit Snackbar pomocí Scaffold?

Předejte ScaffoldState parametru scaffoldState Scaffold, poté zavolejte state.snackbarHostState.showSnackbar(„Zpráva”) uvnitř korutiny. Scaffold automaticky zobrazí Snackbar ve spodní části obrazovky.

Lze použít Scaffold bez scaffoldState?

Ano, Scaffold vytváří výchozí interní stav, pokud scaffoldState není předán. Pro programové řízení Drawer a Snackbar však musíte vytvořit a předat ScaffoldState pomocí rememberScaffoldState().

Jak změnit polohu FloatingActionButton v Scaffold?

Použijte parametr floatingActionButtonPosition Scaffold. Ve výchozím nastavení je FAB v pravo dole (FabPosition.End). Nastavte FabPosition.Center pro umístění FAB do středu spodního okraje obrazovky.

Shrnutí

  • Scaffold — kostra obrazovky Material Design se správou slotů pro TopAppBar, BottomBar, FAB, Drawer a Snackbar a automatickými systémovými mezerami.
  • topBar, bottomBar a floatingActionButton — sloty Scaffold pro integraci standardních komponent se správným umístěním.
  • ScaffoldState spojuje DrawerState a SnackbarHostState a poskytuje programové řízení postranní nabídky a oznámení pomocí korutin.
  • innerPadding — povinný parametr content bloku obsahující mezery pro systémové prvky a nainstalované sloty Scaffold.
  • drawerGesturesEnabled a floatingActionButtonPosition — další parametry pro jemné dolaďování chování Scaffold.
  • Scaffold automaticky zpracovává mezery pro stavový řádek a navigační panel na zařízeních s různými konfiguracemi obrazovky.
  • Pro jednoduché obrazovky bez Material komponent není Scaffold povinný, ale je doporučen jako kořenový prvek pro správnou funkci systémových mezer.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také