Scaffold στο Jetpack Compose — τι είναι, ιδιότητες και πώς λειτουργεί

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-06-29 Χρόνος ανάγνωσης: 11 λεπ

Scaffold — είναι μια composable συνάρτηση στο Jetpack Compose που υλοποιεί τη βασική δομή οθόνης σύμφωνα με την προδιαγραφή Material Design. Το Scaffold παρέχει υποδοχές (slots) για 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 block. Περιέχουν τα απαραίτητα διαστήματα ώστε το περιεχόμενο να μην επικαλύπτει τα 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(“Μήνυμα”) μέσα σε ένα coroutine. Το 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, παρέχοντας προγραμματικό έλεγχο του πλευρικού μενού και των ειδοποιήσεων μέσω coroutines.
  • innerPadding — υποχρεωτική παράμετρος του content block που περιέχει διαστήματα για τα συστημικά στοιχεία και τις εγκατεστημένες υποδοχές Scaffold.
  • drawerGesturesEnabled και floatingActionButtonPosition — επιπλέον παράμετροι για λεπτή ρύθμιση της συμπεριφοράς του Scaffold.
  • Scaffold επεξεργάζεται αυτόματα τα διαστήματα για τη γραμμή κατάστασης και τον πίνακα πλοήγησης σε συσκευές με διαφορετικές διατάξεις οθόνης.
  • Για απλές οθόνες χωρίς στοιχεία Material, το Scaffold δεν είναι υποχρεωτικό αλλά συνιστάται ως ριζικό στοιχείο για σωστή λειτουργία των συστημικών διαστημάτων.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης