Jetpack Compose: əsaslar, Composable funksiyaları və State

Müəllif: IT Sectr Dərc olunub: 2026-02-21 Oxuma vaxtı: 8 dəq

Jetpack Compose — Google tərəfindən Android inkişafı üçün yaradılmış müasir deklarativ UI framework-ü, stabil versiyası 1.0 2021-ci ilin iyulunda təqdim edilmişdir. Compose imperativ XML işarələməsini və View sistemini @Composable annotasiyası ilə Kotlin funksiyaları ilə əvəz edir. Google I/O (2025) məlumatına görə, Compose Android-də yeni layihələrin 55%-də istifadə olunur və UI kodunun orta ölçüsü XML ilə müqayisədə 30–50% azalır. Framework State dəyişdikdə ekranın yalnız dəyişmiş hissələrini avtomatik yenidən çəkir, əl ilə notifyDataSetChanged və ya findViewById çağırışını aradan qaldırır.

Əsas

  • Jetpack Compose — Google-un Android üçün Kotlin-də deklarativ UI framework-ü (@Composable funksiyaları XML işarələməsi əvəzinə).
  • @Composable — UI hissəsini təsvir edən funksiyanın annotasiyası, parametrlər qəbul edə və State oxuya bilər.
  • State və MutableState — reaktivlik mexanizmi: State dəyişdikdə Compose yalnız asılı Composable funksiyalarını yenidən işə salır (recompose).
  • remember — dəyəri rekompozisiyalar arasında keşləmə funksiyası; onsuz State hər yeniləmədə sıfırlanır.
  • Modifier — Composable-in görünüşünü və davranışını idarə edən ayarlar zənciri (padding, size, clickable, background).

Jetpack Compose nədir?

Jetpack Compose — reaktiv proqramlaşdırma prinsipləri üzərində qurulmuş Google UI framework-ü. Activity XML düzeni, FragmentManager və ViewBinding əvəzinə, developer interfeysi @Composable annotasiyası ilə Kotlin funksiyaları vasitəsilə təsvir edir. Compose LayoutInflater-dən istifadə etmir — UI bayt koduna kompilyasiya olunan təmiz Kotlin funksiyalarıdır. Framework bir neçə kitabxanadan ibarətdir: Compose UI (əsas komponentlər Text, Button, Column, Row), Compose Foundation (Material Design, Jestlər, Focus), Compose Material3 (Dynamic Colors ilə Material You) və Compose Runtime (State, Side Effects, Coroutines). Compose Android API 21+ (Android 5.0) üzərində işləyir və ComposeView — AndroidView adapteri vasitəsilə mövcud View/XML kodu ilə tam uyğundur.

Compose vs View System

View System (2008) əl ilə idarə olunan View obyektləri iyerarxiyasından istifadə edir: developer XML düzəni yaradır, findViewById vasitəsilə View tapır, RecyclerView üçün Adapter tətbiq edir və məlumat dəyişdikdə notifyDataSetChanged çağırır. Compose UI-ni funksional təsvir edir: vəziyyət dəyişdikdə framework yalnız dəyişmiş Composable funksiyalarını yenidən işə salır (recompose), diff hesablayır və Canvas-a minimal dəyişikliklər tətbiq edir. Compose-un performansı View System ilə müqayisə oluna bilər, mürəkkəb siyahılar (LazyColumn) ssenarilərində isə key parametri vasitəsilə lazımsız elementləri atlayaraq RecyclerView-i tez-tez üstələyir. IT Sectr-də Compose minSdk 24+ olan Android tətbiqlərinin yeni modullarında istifadə olunur.

Composable funksiyaları: UI-nin tikinti blokları

@Composable — adi Kotlin funksiyasını UI tikinti blokuna çevirən annotasiya. Composable funksiyaları digər Composable funksiyalarını çağıra bilər, komponentlər ağacı əmələ gətirir. View-dən fərqli olaraq, Composable funksiyaları standart olaraq vəziyyətə malik deyil — onlar stateless-dir və giriş parametrləri və ya State hər dəyişdikdə yenidən çəkilir. Compiler (Compose Compiler) @Composable funksiyalarını dayandırıla və bərpa oluna bilən koda çevirir (positional memoization) — bu, Compose-a ağacı tamamilə yenidən qurmadan yalnız dəyişmiş hissələri yenidən başlatmağa imkan verir.

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 funksiyası name və avatarUrl parametrlərini qəbul edir, avatar və ad ilə sətir qurur. Modifier.fillMaxWidth() komponenti tam genişliyə uzadır, .padding(16.dp) boşluqlar əlavə edir. MaterialTheme.typography.titleMedium Material 3 sistem stilindən istifadə edir. name və ya avatarUrl parametrləri dəyişdikdə Compose UserProfile-i yenidən başladır — komponentin yeni dəyərlərlə təkrar yaradılması.

Jetpack Compose-da State və Recomposition

State Compose-da — dəyişməsi asılı @Composable funksiyalarının rekompozisiyasına (yenidən başlamasına) səbəb olan istənilən dəyərdir. Əsas üsul — Compose snapshot sistemini dəstəkləyən MutableState<T> yaradan mutableStateOf()-dir. Snapshot — dəyişiklikləri izləmə mexanizmi: State-ə yazarkən Compose cari Snapshot-ı dirty olaraq qeyd edir və rekompozisiya planlayıcısı yalnız bu State-i oxuyan Composable funksiyalarını yenidən başladır. Observable kolleksiyalar üçün mutableStateListOf() və mutableStateMapOf() istifadə edin. Compose Kotlin Flow üçün collectAsState() və LiveData üçün observeAsState() vasitəsilə Lifecycle-Aware komponentlərdən State dəstəkləyir.

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")
    }
}

Kod liked (Boolean) və count (Int) vəziyyəti ilə mutableStateOf() vasitəsilə saxlanılan «Like» düyməsi yaradır. Basıldıqda liked tərsinə çevrilir, sayğac artır/azalır — Compose avtomatik LikeButton-i yenidən başladır. by delegate State-dən adi dəyişən kimi istifadə etməyə imkan verir: liked.value = !liked.value əvəzinə liked = !liked. Düymənin rəngi primary (bəyənilib) və surfaceVariant (bəyənilməyib) arasında reaktiv dəyişir.

remember: rekompozisiyalar arasında keşləmə

remember — dəyəri rekompozisiyalar arasında keşləyən Compose funksiyası. remember olmadan Composable funksiyasının hər yenidən başlaması yeni vəziyyət (mutableStateOf) yaradır — bu tətbiqin məntiqini pozur: ekran döndərildikdə və ya valideyn State dəyişdikdə sayğac sıfırlanacaq. remember kalkulyator-lambda qəbul edir və dəyəri yalnız ilk kompozisiyada hesablayır; sonrakılarda keşlənmiş nəticəni qaytarır. Keşi sıfırlamaq üçün remember(key) istifadə edin — açar dəyərin nə vaxt yenidən hesablanacağını müəyyən edir. remember(key1, key2) hər hansı açar dəyişdikdə yenidən hesablayır. Uzunömürlü vəziyyətlər (ekran döndərilməsindən sağ çıxan) üçün rememberSaveable istifadə edin — SavedStateHandle vasitəsilə Bundle-da saxlanılan remember analoqu.

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 = "Keçən vaxt: ${seconds}s",
            style = MaterialTheme.typography.displayMedium
        )
    }
}

rememberSaveable ekran döndərildikdə (konfiqurasiya dəyişikliyi) seconds-i qoruyur. LaunchedEffect hər saniyə seconds-i artıran korutin işə salır. TimerScreen rekompozisiyasında (hər saniyə) seconds rememberSaveable sayəsində sıfırlanmır. Konfiqurasiya dəyişikliklərindən sağ çıxmamalı olan vəziyyət üçün (məsələn, animasiya bayraqları) adi remember istifadə edin.

Modifier: Composable ayarlar zənciri

Modifier — Composable komponentlərinin görünüşünü, davranışını və düzənini tənzimləmək üçün Builder nümunəsini tətbiq edən dəyişməz konteyner-obyektdir. Modifier metodunun hər çağırışı (.padding(), .width(), .clickable(), .background()) əlavə edilmiş elementlə yeni Modifier qaytarır. Modifikatorların sırası önəm daşıyır: .padding(16.dp).clickable { } — boşluq klik işləyicisindən əvvəl tətbiq olunur, clickable boşluq nəzərə alınmaqla bütün sahəni izləyir. .clickable { }.padding(16.dp) — klik üçün boşluqdan əvvəlki bütün sahə, boşluq məzmunu içəriyə sürüşdürür. Modifier then(otherModifier) vasitəsilə xüsusi tətbiqləri və valideyn ayarlarına giriş üçün compositionLocal-ı dəstəkləyir.

kotlin
@Composable
fun CardExample() {
    Card(
        modifier = Modifier
            .fillMaxWidth()
            .padding(16.dp)
            .clickable { println("Karta klikləndi") },
        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(
                "State və Modifier ilə Android üçün Deklarativ UI",
                style = MaterialTheme.typography.bodyMedium
            )
        }
    }
}

CardExample Modifier zəncirini nümayiş etdirir: fillMaxWidth + padding + clickable. Card — öz elevation və colors ayarları ilə Material3 komponenti. İç-içə Column daxili padding 16dp-ə malikdir. Compose Material3 Android 12+-da rəngləri avtomatik Dynamic Color (Material You) uyğunlaşdırır. Card Compose-da 30+ daxili Material3 komponentindən biridir.

State hoisting və Compose arxitekturası

State hoisting — vəziyyətin Composable funksiyasından onu çağırana qaldırılması nümunəsi, funksiyanı stateless edir. Stateless komponent parametrlər vasitəsilə məlumat və callback-lər qəbul edir, öz State-inə sahib deyil. Bu təkrar istifadəni və test edilməni artırır: komponent müxtəlif State ilə çağırıla və preview-də yoxlana bilər. Google arxitekturanı tövsiyə edir: ViewModel + StateFlow (və ya MutableStateFlow) + Compose-da collectAsState(). ViewModel vəziyyəti ekran səviyyəsinə qaldırır, Compose göstərir. Yan təsirlər (LaunchedEffect, DisposableEffect) birdəfəlik hadisələri idarə edir.

KomponentVəzifəTexnologiya
ViewModelState-in saxlanması, biznes məntiqiStateFlow, MutableStateFlow
Screen ComposableEkranın təşkili, State hoistingcollectAsState(), Scaffold, LazyColumn
Stateless ComponentVəziyyətsiz UI, təmiz göstərim@Composable parametrlər + lambdalar
Side EffectBirdəfəlik hərəkətlər (snackbar, naviqasiya)LaunchedEffect, SnackbarHostState

Tez-tez verilən suallar

Jetpack Compose XML düzenlərindən nə ilə fərqlənir?

XML düzenləri imperativdir: LayoutInflater XML yükləyir, findViewById View tapır, developer əl ilə mətn/siyahıları yeniləyir. Compose deklarativdir: UI Kotlin @Composable funksiyaları ilə təsvir olunur və framework State dəyişdikdə avtomatik yalnız dəyişmiş hissələri yenidən çəkir. Compose UI kodunun həcmini 30–50% azaldır və XML istifadə etmir.

Compose-da naviqasiya üçün ayrıca kitabxana lazımdır?

Bəli, Google Navigation Compose — ekranlar arasında deklarativ naviqasiya üçün kitabxana təqdim edir. NavController marşrut yığınını idarə edir, composable() ekranları qeydiyyatdan keçirir, navArgument parametrləri ötürür. Alternativlər: Voyager (community) və Decompose (Badoo). Navigation Compose deep links və type-safe arqumentlər dəstəyi ilə rəsmi standartdır.

Jetpack Compose-da Modifier nədir?

Modifier — Composable komponentlərinə tətbiq olunan stilləşdirmə nümunələrinin (padding, size, clickable, background, border, clip) dəyişməz konteyneridir. Hər çağırış əlavə edilmiş elementlə yeni Modifier qaytarır. Sıra vacibdir: .padding().clickable() klikdən əvvəl boşluq tətbiq edir, .clickable().padding() — əksinə. Modifier Compose komponentlərini fərdiləşdirmənin əsas yoludur.

Compose Android-in bütün versiyalarında işləyir?

Jetpack Compose Android API 21+ (Android 5.0 Lollipop) Compose Compiler və Compose BOM vasitəsilə dəstəkləyir. Material 3 (Dynamic Colors) Android 12+-da mövcuddur; köhnə versiyalarda fallback palitrası istifadə olunur. Yeni layihələr üçün Apple minSdk 24+ (Android 7.0) tövsiyə edir ki, bu da Compose tərəfindən tam əhatə olunur.

Compose komponentlərini necə test etmək olar?

Google Compose UI Test — JVM (Desktop) və emulatorda test üçün kitabxana təqdim edir. Əsas funksiyalar: composeTestRule.setContent { } komponenti göstərmək üçün, onNodeWithText() elementləri tapmaq üçün, performClick()/performTextInput() hərəkətlər üçün. Espresso testləri ComposeTestRule vasitəsilə Compose ilə uyğundur, lakin Compose UI Test daha sürətli və üstünlük verilən yanaşmadır.

Nəticə

  • Jetpack Compose — Google-un Android üçün Kotlin @Composable funksiyaları ilə deklarativ UI framework-ü (2021-dən stabil).
  • @Composable — Kotlin funksiyasını UI komponentinə çevirən annotasiya; Composable funksiyalar ağacı View iyerarxiyasını əvəz edir.
  • State və mutableStateOf — Snapshot sistemi vasitəsilə Compose reaktivliyinin əsası; rekompozisiya yalnız asılı funksiyalara təsir edir.
  • remember dəyəri rekompozisiyalar arasında keşləyir; rememberSaveable konfiqurasiya dəyişikliklərində State-i qoruyur.
  • Modifier — dəyişməz konteyner yaradan ayarlar zənciri (padding, size, clickable, background); modifikatorların sırası vacibdir.
  • State hoisting — vəziyyətin stateless komponentlər üçün yuxarı qaldırılması nümunəsi; ViewModel + StateFlow + collectAsState() — tövsiyə olunan arxitektura.
  • Material 3 Dynamic Colors ilə (Android 12+) — cihazın divar kağızına avtomatik uyğunlaşan standart Compose mövzusu.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun