Scaffold — είναι μια composable συνάρτηση στο Jetpack Compose που υλοποιεί τη βασική δομή οθόνης σύμφωνα με την προδιαγραφή Material Design. Το Scaffold παρέχει υποδοχές (slots) για 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 block. Περιέχουν τα απαραίτητα διαστήματα ώστε το περιεχόμενο να μην επικαλύπτει τα 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(“Μήνυμα”) μέσα σε ένα coroutine. Το Scaffold θα εμφανίσει αυτόματα το Snackbar στο κάτω μέρος της οθόνης.
Ναι, το Scaffold δημιουργεί από προεπιλογή εσωτερική κατάσταση εάν δεν μεταβιβαστεί το scaffoldState. Ωστόσο, για τον προγραμματικό έλεγχο του Drawer και του Snackbar, πρέπει να δημιουργήσετε και να μεταβιβάσετε το ScaffoldState μέσω rememberScaffoldState().
Χρησιμοποιείστε την παράμετρο floatingActionButtonPosition του Scaffold. Από προεπιλογή, το FAB βρίσκεται κάτω δεξιά (FabPosition.End). Ορίστε FabPosition.Center για να τοποθετήσετε το FAB στο κέντρο του κάτω άκρου της οθόνης.
Περίληψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης