Scaffold — ay isang composable function sa Jetpack Compose na nagpapatupad ng pangunahing istruktura ng screen ayon sa detalye ng Material Design. Ang Scaffold ay nagbibigay ng mga slot para sa TopAppBar, BottomBar, FloatingActionButton, Drawer at Snackbar. Ayon sa Google Android Documentation, 2025, ang Scaffold ay isang mandatoryong elemento para sa karamihan ng mga screen sa mga aplikasyon ng Compose, dahil pinamamahalaan nito ang mga puwang para sa mga system component ng Material Design.
Mga pangunahing punto
Scaffold — ay isang composable function na nagpapatupad ng balangkas ng screen ayon sa detalye ng Material Design. Ang Scaffold ay hindi isang container sa karaniwang kahulugan — ito ay isang layout manager na nag-uugnay sa paglalagay ng maraming karaniwang Material component sa screen.
Pinamamahalaan ng Scaffold ang mga puwang para sa TopAppBar, BottomBar at FloatingActionButton, pati na rin ang mga system element — status bar at navigation panel. Tinitiyak nito na ang nilalaman ay hindi sumasakop sa mga system element at sumusunod sa mga alituntunin ng Material Design.
Ayon sa Material Design Guidelines, 2025, ang Scaffold ay dapat na root element ng bawat screen ng aplikasyon. Pinapalitan nito ang lumang CoordinatorLayout mula sa View system at nagbibigay ng mas simple at deklaratibong API para sa pagbuo ng layout ng screen.
Scaffold tumatanggap ng mga parameter na modifier, scaffoldState, topBar, bottomBar, floatingActionButton, drawerContent, snackbarHost at content. Ang parameter na content ay tumatanggap ng PaddingValues — mga puwang na dapat isaalang-alang ng pangunahing nilalaman.
@Composable
fun BasicScaffold() {
Scaffold(
topBar = {
TopAppBar(
title = { Text("Tahanan") }
)
},
floatingActionButton = {
FloatingActionButton(onClick = {}) {
Icon(Icons.Default.Add, contentDescription = "Add")
}
}
) { innerPadding ->
Column(
modifier = Modifier.padding(innerPadding)
) {
Text("Pangunahing nilalaman")
}
}
}
topBar — slot para sa paglalagay ng itaas na panel ng aplikasyon, karaniwang TopAppBar o LargeTopAppBar. Awtomatikong nagdaragdag ang Scaffold ng puwang sa innerPadding para sa nilalaman upang hindi ito sumakop sa topBar. Ang TopAppBar ay maaaring maglaman ng pamagat, navigation icon at mga aksyon.
bottomBar — slot para sa ibabang navigation panel. Sinusuportahan ang BottomNavigation, BottomAppBar o NavigationBar. Isinasaalang-alang ng Scaffold ang taas ng bottomBar sa pagkalkula ng innerPadding para sa nilalaman. Ayon sa Material Design Guidelines, 2025, ang bottomBar ay dapat gamitin sa mga screen na may 3–5 navigation point.
floatingActionButton — slot para sa lumulutang na button ng aksyon. Awtomatikong pumuwesto ang Scaffold ng FAB ayon sa detalye ng Material Design — sa kanang ibabang sulok na may tamang puwang. Ang floatingActionButtonPosition ay nagpapahintulot na ilipat ang FAB sa gitna ng ibabang gilid ng screen.
Sa halimbawang ito, ang Scaffold ay gumagamit ng lahat ng pangunahing slot: TopAppBar na may pamagat, BottomBar na may tatlong navigation element at FloatingActionButton para sa pangunahing aksyon.
@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, "Tahanan") },
label = { Text("Home") },
selected = true,
onClick = {}
)
NavigationBarItem(
icon = { Icon(Icons.Default.Search, "Maghanap") },
label = { Text("Search") },
selected = false,
onClick = {}
)
}
},
floatingActionButton = {
FloatingActionButton(onClick = {}) {
Icon(Icons.Default.Add, "Add")
}
}
) { innerPadding ->
Box(modifier = Modifier.padding(innerPadding)) {
Text("Nilalaman ng screen")
}
}
}
ScaffoldState — object ng estado ng Scaffold na pinagsasama ang DrawerState at SnackbarHostState. Ang DrawerState ay namamahala sa pagbubukas at pagsasara ng side menu, at ang SnackbarHostState — sa pagpapakita at pagtatago ng Snackbar. Ang estado ay nilikha sa pamamagitan ng rememberScaffoldState() at ipinapasa sa parameter na scaffoldState.
DrawerState ay nagbibigay ng mga method na open at close para sa programatikong pamamahala ng Drawer. Ang estado ng Drawer ay maaaring bukas, sarado o bahagyang bukas. Ang drawerGesturesEnabled ay nagpapahintulot na huwag paganahin ang kilos ng pagbubukas ng Drawer sa pamamagitan ng pag-swipe, na nag-iiwan lamang ng programatikong pagbubukas sa pamamagitan ng button.
SnackbarHostState namamahala sa Snackbar — pansamantalang mga notipikasyon sa ibabang bahagi ng screen. Ang method na showSnackbar ay nagpapakita ng Snackbar na may mensahe at opsyonal na aksyon. Ayon sa Material Design Guidelines, 2025, ang Snackbar ay dapat gamitin para sa maiikling mensahe na walang kritikal na mahalagang impormasyon.
@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("Nilalaman")
}
}
}
Isang kumpletong halimbawa ng screen na may Scaffold ay kinabibilangan ng TopAppBar, BottomNavigation, FloatingActionButton at Snackbar para sa pagpapakita ng mga notipikasyon kapag pinindot ang FAB. Ang ScaffoldState ay ipinapasa sa lahat ng component para sa koordinasyon ng 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, "Tahanan") },
label = { Text("Home") }, selected = true, onClick = {})
NavigationBarItem(icon = { Icon(Icons.Default.Settings, "Mga setting") },
label = { Text("Settings") }, selected = false, onClick = {})
}
},
floatingActionButton = {
FloatingActionButton(onClick = {
scope.launch {
state.snackbarHostState.showSnackbar("Tapos")
}
}) {
Icon(Icons.Default.Add, "Add")
}
}
) { padding ->
Box(
modifier = Modifier.padding(padding).fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text("Maligayang pagdating")
}
}
}
innerPadding — ay PaddingValues na ipinapasa ng Scaffold sa content block. Naglalaman ang mga ito ng mga puwang na kinakailangan upang hindi sumakop ang nilalaman sa statusBar, navigationBar, topBar at bottomBar. Ang paggamit ng innerPadding ay mandatory para sa tamang pagpapakita sa iba’t ibang device.
Ang Scaffold ay awtomatikong nagkalkula ng innerPadding batay sa mga system na puwang at taas ng mga naka-install na slot. Sa mga device na may camera island o screen cutout, inaayos ng Scaffold ang mga puwang para sa status bar. Sa mas lumang device na may physical na button, ang ibabang puwang ay maaaring zero.
Ayon sa Android Developers, 2024, ang innerPadding ay dapat ilapat sa root container ng nilalaman sa pamamagitan ng Modifier.padding(innerPadding). Kung ang nilalaman ay gumagamit ng scrollable container, ang innerPadding ay inilalapat sa pamamagitan ng Modifier.consumeWindowInsets para sa tamang paggana ng keyboard at system gestures.
Mga madalas itanong
Scaffold ay hindi isang container, kundi isang layout manager na namamahala ng mga slot para sa TopAppBar, BottomBar, FAB, Drawer at Snackbar at awtomatikong nagpoproseso ng mga puwang para sa mga system component. Ang Column at Box ay naglalagay lamang ng mga element nang hindi isinasaalang-alang ang Material Design.
Scaffold ay inirerekomenda para sa mga screen na gumagamit ng Material Design component. Sa mga simpleng screen na walang TopAppBar, BottomBar o FAB, hindi mandatory ang Scaffold, ngunit nagbibigay ito ng tamang system na puwang sa pamamagitan ng innerPadding, na kapaki-pakinabang kahit walang slot.
Ipasa ang ScaffoldState sa parameter na scaffoldState ng Scaffold, pagkatapos ay tawagan ang state.snackbarHostState.showSnackbar(“Mensahe”) sa loob ng coroutine. Awtomatikong magpapakita ang Scaffold ng Snackbar sa ibabang bahagi ng screen.
Oo, ang Scaffold ay gumagawa ng default na internal na estado kung hindi ipinasa ang scaffoldState. Gayunpaman, para sa programatikong pamamahala ng Drawer at Snackbar, kailangan mong lumikha at magpasa ng ScaffoldState sa pamamagitan ng rememberScaffoldState().
Gamitin ang parameter na floatingActionButtonPosition ng Scaffold. Bilang default, ang FAB ay nasa kanang ibaba (FabPosition.End). Itakda ang FabPosition.Center upang ilagay ang FAB sa gitna ng ibabang gilid ng screen.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din