Jetpack Compose: βασικά, συναρτήσεις Composable και State

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

Jetpack Compose — το σύγχρονο δηλωτικό UI framework από την Google για ανάπτυξη Android, που κυκλοφόρησε σε σταθερή έκδοση 1.0 τον Ιούλιο του 2021. Το Compose αντικαθιστά την προστακτική σήμανση XML και το σύστημα View με συναρτήσεις Kotlin με σχολιασμό @Composable. Σύμφωνα με το Google I/O (2025), το Compose χρησιμοποιείται στο 55% των νέων έργων Android και το μέσο μέγεθος κώδικα UI μειώνεται κατά 30–50% σε σύγκριση με το XML. Το framework ανασχεδιάζει αυτόματα μόνο τα τροποποιημένα μέρη της οθόνης κατά την αλλαγή State, εξαλείφοντας την μη αυτόματη κλήση notifyDataSetChanged ή findViewById.

Κύρια

  • Jetpack Compose — δηλωτικό UI framework της Google για Android σε Kotlin (συναρτήσεις @Composable αντί για σήμανση XML).
  • @Composable — σχολιασμός συνάρτησης που περιγράφει μέρος του UI, μπορεί να δέχεται παραμέτρους και να διαβάζει State.
  • State και MutableState — μηχανισμός αντιδραστικότητας: κατά την αλλαγή State, το Compose επανεκκινεί (recompose) μόνο τις εξαρτημένες συναρτήσεις Composable.
  • remember — συνάρτηση προσωρινής αποθήκευσης τιμής μεταξύ ανασυνθέσεων· χωρίς αυτήν, το State επαναφέρεται σε κάθε ενημέρωση.
  • Modifier — αλυσίδα ρυθμίσεων (padding, size, clickable, background) που διαχειρίζεται την εμφάνιση και συμπεριφορά του Composable.

Τι είναι το Jetpack Compose;

Jetpack Compose — UI framework της Google βασισμένο σε αρχές αντιδραστικού προγραμματισμού. Αντί για Activity με διατάξεις XML, FragmentManager και ViewBinding, ο προγραμματιστής περιγράφει τη διεπαφή μέσω συναρτήσεων Kotlin με σχολιασμό @Composable. Το Compose δεν χρησιμοποιεί LayoutInflater — το UI είναι καθαρές συναρτήσεις Kotlin, μεταγλωττισμένες σε bytecode. Το framework αποτελείται από πολλές βιβλιοθήκες: Compose UI (βασικά στοιχεία Text, Button, Column, Row), Compose Foundation (Material Design, Χειρονομίες, Εστίαση), Compose Material3 (Material You με Dynamic Colors) και Compose Runtime (State, Side Effects, Coroutines). Το Compose λειτουργεί σε Android API 21+ (Android 5.0) και είναι πλήρως συμβατό με υπάρχον κώδικα View/XML μέσω ComposeView — του προσαρμογέα AndroidView.

Compose vs View System

View System (2008) χρησιμοποιεί ιεραρχία αντικειμένων View με μη αυτόματη διαχείριση: ο προγραμματιστής δημιουργεί διάταξη XML, βρίσκει View μέσω findViewById, υλοποιεί Adapter για RecyclerView και καλεί notifyDataSetChanged κατά την αλλαγή δεδομένων. Το Compose περιγράφει το UI λειτουργικά: κατά την αλλαγή κατάστασης, το framework επανεκκινεί (recompose) μόνο τις τροποποιημένες συναρτήσεις Composable, υπολογίζει diff και εφαρμόζει ελάχιστες αλλαγές στο Canvas. Η απόδοση του Compose είναι συγκρίσιμη με το View System, και σε σενάρια με σύνθετες λίστες (LazyColumn) συχνά υπερτερεί του RecyclerView παρακάμπτοντας περιττά στοιχεία μέσω της παραμέτρου key. Στην IT Sectr, το Compose χρησιμοποιείται για νέες ενότητες εφαρμογών Android με minSdk 24+.

Συναρτήσεις Composable: δομικά στοιχεία UI

@Composable — σχολιασμός που μετατρέπει μια συνηθισμένη συνάρτηση Kotlin σε δομικό στοιχείο UI. Οι συναρτήσεις Composable μπορούν να καλούν άλλες συναρτήσεις Composable, σχηματίζοντας δέντρο στοιχείων. Σε αντίθεση με το View, οι συναρτήσεις Composable δεν έχουν προεπιλεγμένη κατάσταση — είναι stateless και ανασχεδιάζονται σε κάθε αλλαγή παραμέτρων εισόδου ή State. Ο μεταγλωττιστής (Compose Compiler) μετασχηματίζει τις @Composable συναρτήσεις σε κώδικα που μπορεί να διακοπεί και να συνεχιστεί (positional memoization) — αυτό επιτρέπει στο Compose να επανεκκινεί μόνο τα τροποποιημένα μέρη χωρίς πλήρη ανακατασκευή του δέντρου.

kotlin
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp

@Composable
fun UserProfile(name: String, avatarUrl: String) {
    Row(
        modifier = Modifier
            .fillMaxWidth()
            .padding(16.dp),
        verticalAlignment = Alignment.CenterVertically
    ) {
        AsyncImage(
            model = avatarUrl,
            contentDescription = "User avatar",
            modifier = Modifier.size(48.dp)
        )
        Spacer(modifier = Modifier.width(12.dp))
        Text(
            text = name,
            style = MaterialTheme.typography.titleMedium
        )
    }
}

Η συνάρτηση UserProfile δέχεται name και avatarUrl ως παραμέτρους, χτίζει μια γραμμή με άβαταρ και όνομα. Το Modifier.fillMaxWidth() τεντώνει το στοιχείο σε πλήρες πλάτος, το .padding(16.dp) προσθέτει αποστάσεις. Το MaterialTheme.typography.titleMedium χρησιμοποιεί το στυλ συστήματος Material 3. Κατά την αλλαγή των παραμέτρων name ή avatarUrl, το Compose επανεκκινεί το UserProfile — εκ νέου δημιουργία του στοιχείου με νέες τιμές.

State και Recomposition στο Jetpack Compose

State στο Compose — οποιαδήποτε τιμή της οποίας η αλλαγή προκαλεί ανασύνθεση (επανεκκίνηση) των εξαρτημένων @Composable συναρτήσεων. Η βασική μέθοδος είναι η mutableStateOf(), που δημιουργεί MutableState<T> με υποστήριξη για το σύστημα στιγμιότυπων Compose. Snapshot — μηχανισμός παρακολούθησης αλλαγών: κατά την εγγραφή στο State, το Compose σημειώνει το τρέχον Snapshot ως βρώμικο και ο προγραμματιστής ανασύνθεσης επανεκκινεί μόνο τις συναρτήσεις Composable που διαβάζουν αυτό το State. Για παρατηρήσιμες συλλογές χρησιμοποιήστε mutableStateListOf() και mutableStateMapOf(). Το Compose υποστηρίζει State από στοιχεία Lifecycle-Aware μέσω collectAsState() για Kotlin Flow και observeAsState() για LiveData.

kotlin
@Composable
fun LikeButton() {
    var liked by remember { mutableStateOf(false) }
    var count by remember { mutableStateOf(42) }
    
    Button(
        onClick = {
            liked = !liked
            if (liked) count++ else count--
        },
        colors = ButtonDefaults.buttonColors(
            containerColor = if (liked) MaterialTheme.colorScheme.primary
                else MaterialTheme.colorScheme.surfaceVariant
        )
    ) {
        Text("♥ $count")
    }
}

Ο κώδικας δημιουργεί ένα κουμπί «Like» με κατάσταση liked (Boolean) και count (Int), αποθηκευμένα μέσω mutableStateOf(). Κατά το πάτημα, το liked αντιστρέφεται, ο μετρητής αυξάνεται/μειώνεται — το Compose επανεκκινεί αυτόματα το LikeButton. Ο by delegate επιτρέπει τη χρήση του State ως συνηθισμένης μεταβλητής: liked = !liked αντί για liked.value = !liked.value. Το χρώμα του κουμπιού αλλάζει αντιδραστικά μεταξύ primary (αρεστό) και surfaceVariant (μη αρεστό).

remember: προσωρινή αποθήκευση μεταξύ ανασυνθέσεων

remember — συνάρτηση Compose που αποθηκεύει προσωρινά την τιμή μεταξύ ανασυνθέσεων. Χωρίς remember, κάθε επανεκκίνηση της συνάρτησης Composable δημιουργεί νέα κατάσταση (mutableStateOf) — αυτό σπάει τη λογική της εφαρμογής: κατά την περιστροφή οθόνης ή αλλαγή γονικού State, ο μετρητής επαναφέρεται. Το remember δέχεται ένα lambda-υπολογιστή και υπολογίζει την τιμή μόνο στην πρώτη σύνθεση· στις επόμενες επιστρέφει το προσωρινά αποθηκευμένο αποτέλεσμα. Για επαναφορά της προσωρινής μνήμης χρησιμοποιήστε remember(key) — το κλειδί καθορίζει πότε να υπολογιστεί ξανά η τιμή. Το remember(key1, key2) υπολογίζει ξανά κατά την αλλαγή οποιουδήποτε κλειδιού. Για μακροχρόνιες καταστάσεις (που επιβιώνουν περιστροφής οθόνης) χρησιμοποιήστε rememberSaveable — ανάλογο του remember με αποθήκευση στο Bundle μέσω SavedStateHandle.

kotlin
@Composable
fun TimerScreen() {
    var seconds by rememberSaveable { mutableStateOf(0) }
    
    LaunchedEffect(Unit) {
        while (true) {
            delay(1000)
            seconds++
        }
    }
    
    Column(
        modifier = Modifier.fillMaxSize().padding(32.dp),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Text(
            text = "Πέρασε: ${seconds}s",
            style = MaterialTheme.typography.displayMedium
        )
    }
}

Το rememberSaveable διατηρεί το seconds κατά την περιστροφή οθόνης (αλλαγή διαμόρφωσης). Το LaunchedEffect εκκινεί μια κορουτίνα που αυξάνει το seconds κάθε δευτερόλεπτο. Κατά την ανασύνθεση του TimerScreen (κάθε δευτερόλεπτο) το seconds δεν επαναφέρεται χάρη στο rememberSaveable. Χρησιμοποιήστε το συνηθισμένο remember για κατάσταση που δεν πρέπει να επιβιώνει αλλαγών διαμόρφωσης (π.χ. σημαίες κινούμενων σχεδίων).

Modifier: αλυσίδα ρυθμίσεων Composable

Modifier — αμετάβλητο αντικείμενο-δοχείο που υλοποιεί το μοτίβο Builder για ρύθμιση της εμφάνισης, συμπεριφοράς και διάταξης των στοιχείων Composable. Κάθε κλήση μεθόδου Modifier (.padding(), .width(), .clickable(), .background()) επιστρέφει ένα νέο Modifier με το προστιθέμενο στοιχείο. Η σειρά των τροποποιητών έχει σημασία: .padding(16.dp).clickable { } — η απόσταση εφαρμόζεται πριν από τον χειριστή κλικ, το clickable παρακολουθεί ολόκληρη την περιοχή λαμβάνοντας υπόψη την απόσταση. .clickable { }.padding(16.dp) — ολόκληρη η περιοχή πριν από την απόσταση είναι κλικ, η απόσταση μετακινεί το περιεχόμενο προς τα μέσα. Το Modifier υποστηρίζει προσαρμοσμένες υλοποιήσεις μέσω then(otherModifier) και compositionLocal για πρόσβαση σε γονικές ρυθμίσεις.

kotlin
@Composable
fun CardExample() {
    Card(
        modifier = Modifier
            .fillMaxWidth()
            .padding(16.dp)
            .clickable { println("Η κάρτα πατήθηκε") },
        elevation = CardDefaults.cardElevation(defaultElevation = 4.dp),
        colors = CardDefaults.cardColors(
            containerColor = MaterialTheme.colorScheme.surfaceVariant
        )
    ) {
        Column(modifier = Modifier.padding(16.dp)) {
            Text("Jetpack Compose", style = MaterialTheme.typography.titleLarge)
            Spacer(modifier = Modifier.height(8.dp))
            Text(
                "Δηλωτικό UI για Android με State και Modifier",
                style = MaterialTheme.typography.bodyMedium
            )
        }
    }
}

Το CardExample παρουσιάζει την αλυσίδα Modifier: fillMaxWidth + padding + clickable. Η Card — στοιχείο Material3 με δικές του ρυθμίσεις elevation και colors. Το ένθετο Column έχει εσωτερική απόσταση 16dp. Το Compose Material3 προσαρμόζει αυτόματα τα χρώματα στο Dynamic Color (Material You) σε Android 12+. Η Card είναι ένα από τα 30+ ενσωματωμένα στοιχεία Material3 στο Compose.

State hoisting και αρχιτεκτονική Compose

State hoisting — μοτίβο ανύψωσης της κατάστασης από τη συνάρτηση Composable στον καλούντα, καθιστώντας τη συνάρτηση stateless. Το stateless στοιχείο λαμβάνει δεδομένα και callbacks μέσω παραμέτρων, χωρίς να κατέχει δικό του State. Αυτό αυξάνει την επαναχρησιμοποίηση και τη δοκιμασιμότητα: το στοιχείο μπορεί να κληθεί με διαφορετικά State και να δοκιμαστεί σε προεπισκόπηση. Η Google συνιστά την αρχιτεκτονική: ViewModel + StateFlow (ή MutableStateFlow) + collectAsState() στο Compose. Το ViewModel ανυψώνει την κατάσταση σε επίπεδο οθόνης, το Compose εμφανίζει. Οι παρενέργειες (LaunchedEffect, DisposableEffect) χειρίζονται εφάπαξ γεγονότα.

ΣτοιχείοΕυθύνηΤεχνολογία
ViewModelΑποθήκευση State, επιχειρηματική λογικήStateFlow, MutableStateFlow
Screen ComposableΟργάνωση οθόνης, State hoistingcollectAsState(), Scaffold, LazyColumn
Stateless ComponentUI χωρίς κατάσταση, καθαρή εμφάνιση@Composable παράμετροι + lambdas
Side EffectΕφάπαξ ενέργειες (snackbar, πλοήγηση)LaunchedEffect, SnackbarHostState

Συχνές Ερωτήσεις

Σε τι διαφέρει το Jetpack Compose από τις διατάξεις XML;

Οι διατάξεις XML είναι προστακτικές: το LayoutInflater φορτώνει XML, το findViewById βρίσκει View, ο προγραμματιστής ενημερώνει μη αυτόματα κείμενο/λίστες. Το Compose είναι δηλωτικό: το UI περιγράφεται με συναρτήσεις Kotlin @Composable και το framework ανασχεδιάζει αυτόματα μόνο τα τροποποιημένα μέρη κατά την αλλαγή State. Το Compose μειώνει τον όγκο κώδικα UI κατά 30–50% και δεν χρησιμοποιεί XML.

Χρειάζεται ξεχωριστή βιβλιοθήκη για πλοήγηση στο Compose;

Ναι, η Google παρέχει το Navigation Compose — μια βιβλιοθήκη για δηλωτική πλοήγηση μεταξύ οθονών. Το NavController διαχειρίζεται τη στοίβα διαδρομών, το composable() καταχωρεί οθόνες, το navArgument μεταδίδει παραμέτρους. Εναλλακτικές: Voyager (κοινότητα) και Decompose (Badoo). Το Navigation Compose είναι το επίσημο πρότυπο με υποστήριξη deep links και type-safe ορισμάτων.

Τι είναι το Modifier στο Jetpack Compose;

Modifier — ένα αμετάβλητο δοχείο μοτίβων στυλ (padding, size, clickable, background, border, clip) που εφαρμόζονται σε στοιχεία Composable. Κάθε κλήση επιστρέφει ένα νέο Modifier με το προστιθέμενο στοιχείο. Η σειρά έχει σημασία: .padding().clickable() εφαρμόζει απόσταση πριν από το κλικ, .clickable().padding() — αντίστροφα. Το Modifier είναι ο κύριος τρόπος προσαρμογής στοιχείων Compose.

Λειτουργεί το Compose σε όλες τις εκδόσεις Android;

Το Jetpack Compose υποστηρίζει Android API 21+ (Android 5.0 Lollipop) μέσω Compose Compiler και Compose BOM. Το Material 3 (Dynamic Colors) είναι διαθέσιμο σε Android 12+· σε παλαιότερες εκδόσεις χρησιμοποιείται εφεδρική παλέτα. Για νέα έργα, η Apple συνιστά minSdk 24+ (Android 7.0), το οποίο καλύπτεται πλήρως από το Compose.

Πώς δοκιμάζονται τα στοιχεία Compose;

Η Google παρέχει το Compose UI Test — μια βιβλιοθήκη για δοκιμές σε JVM (Desktop) και εξομοιωτή. Βασικές συναρτήσεις: composeTestRule.setContent { } για απόδοση στοιχείου, onNodeWithText() για εύρεση στοιχείων, performClick()/performTextInput() για ενέργειες. Οι δοκιμές Espresso είναι συμβατές με Compose μέσω ComposeTestRule, αλλά το Compose UI Test είναι η προτιμώμενη και ταχύτερη προσέγγιση.

Σύνοψη

  • Jetpack Compose — δηλωτικό UI framework της Google για Android με συναρτήσεις Kotlin @Composable αντί για XML (σταθερό από το 2021).
  • @Composable — σχολιασμός που μετατρέπει συνάρτηση Kotlin σε στοιχείο UI· το δέντρο συναρτήσεων Composable αντικαθιστά την ιεραρχία View.
  • State και mutableStateOf — βάση της αντιδραστικότητας του Compose μέσω συστήματος Snapshot· η ανασύνθεση επηρεάζει μόνο τις εξαρτημένες συναρτήσεις.
  • remember αποθηκεύει προσωρινά την τιμή μεταξύ ανασυνθέσεων· το rememberSaveable διατηρεί το State σε αλλαγές διαμόρφωσης.
  • Modifier — αλυσίδα ρυθμίσεων (padding, size, clickable, background) που σχηματίζει αμετάβλητο δοχείο· η σειρά των τροποποιητών έχει σημασία.
  • State hoisting — μοτίβο ανύψωσης κατάστασης για stateless στοιχεία· ViewModel + StateFlow + collectAsState() — συνιστώμενη αρχιτεκτονική.
  • Material 3 με Dynamic Colors (Android 12+) — προεπιλεγμένο θέμα Compose με αυτόματη προσαρμογή στην ταπετσαρία της συσκευής.

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

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

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

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