Jetpack Compose: temeller, Composable fonksiyonlar ve State

Yazar: IT Sectr Yayınlanma: 2026-02-21 Okuma süresi: 8 dk

Jetpack Compose, Temmuz 2021'de kararlı sürüm 1.0'ı yayınlanan, Google'ın Android geliştirme için modern bildirimsel UI framework'üdür. Compose, zorunlu XML düzenini ve View sistemini @Composable ek açıklamalı Kotlin fonksiyonlarıyla değiştirir. Google I/O (2025)'ya göre, Compose yeni Android projelerinin %55'inde kullanılmaktadır ve ortalama UI kodu boyutu XML'e kıyasla %30–50 oranında azalmaktadır. Framework, State değiştiğinde ekranın yalnızca değişen kısımlarını otomatik olarak yeniden çizer ve notifyDataSetChanged veya findViewById manuel çağrılarını ortadan kaldırır.

Önemli Noktalar

  • Jetpack Compose — Kotlin ile Android için Google'ın bildirimsel UI framework'ü (XML düzeni yerine @Composable fonksiyonlar).
  • @Composable — UI'nın bir bölümünü tanımlayan, parametre alabilen ve State okuyabilen fonksiyon ek açıklaması.
  • State ve MutableState — tepkisellik mekanizması: State değiştiğinde, Compose yalnızca bağımlı Composable fonksiyonları yeniden oluşturur (recompose).
  • remember — yeniden oluşturmalar arasında değerleri önbelleğe alan fonksiyon; onsuz State her güncellemede sıfırlanır.
  • Modifier — bir Composable'in görünümünü ve davranışını kontrol eden ayar zinciri (padding, size, clickable, background).

Jetpack Compose Nedir?

Jetpack Compose, tepkisel programlama ilkeleri üzerine inşa edilmiş bir Google UI framework'üdür. XML düzeni, FragmentManager ve ViewBinding içeren Activity yerine, geliştirici @Composable ek açıklamalı Kotlin fonksiyonları aracılığıyla arayüzü tanımlar. Compose, LayoutInflater kullanmaz — UI, bayt koduna derlenen saf Kotlin fonksiyonlarıdır. Framework birkaç kütüphaneden oluşur: Compose UI (temel bileşenler Text, Button, Column, Row), Compose Foundation (Material Design, Gestures, Focus), Compose Material3 (Dynamic Colors ile Material You) ve Compose Runtime (State, Side Effects, Coroutines). Compose, Android API 21+ (Android 5.0) üzerinde çalışır ve ComposeView (bir AndroidView adaptörü) aracılığıyla mevcut View/XML koduyla tamamen uyumludur.

Compose vs View System

View System (2008), manuel yönetimle View nesneleri hiyerarşisi kullanır: geliştirici XML düzeni oluşturur, findViewById ile Views bulur, RecyclerView için Adapter uygular ve veri değiştiğinde notifyDataSetChanged çağırır. Compose, UI'yı işlevsel olarak tanımlar: durum değiştiğinde, framework yalnızca değiştirilen Composable fonksiyonları yeniden oluşturur, diff'i hesaplar ve Canvas'a minimum değişiklik uygular. Compose performansı View System ile karşılaştırılabilir ve karmaşık listeler (LazyColumn) içeren senaryolarda, key parametresi aracılığıyla gereksiz öğeleri atlayarak RecyclerView'ı genellikle geride bırakır. IT Sectr'de Compose, minSdk 24+ olan Android uygulamalarının yeni modüllerinde kullanılır.

Composable Fonksiyonlar: UI'nın Yapı Taşları

@Composable — sıradan bir Kotlin fonksiyonunu UI yapı taşına dönüştüren ek açıklama. Composable fonksiyonlar diğer Composable fonksiyonları çağırarak bir bileşen ağacı oluşturabilir. View'ın aksine, Composable fonksiyonlar varsayılan olarak duruma sahip değildir — durumsuzdur (stateless) ve giriş parametreleri veya State'teki her değişiklikte yeniden çizilir. Compose Compiler, @Composable fonksiyonları kesintiye uğratılabilir ve devam ettirilebilir koda (positional memoization) dönüştürür — bu, Compose'un ağacı tamamen yeniden oluşturmadan yalnızca değiştirilen kısımları yeniden başlatmasına olanak tanır.

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 fonksiyonu, name ve avatarUrl'ü parametre olarak alır, bir avatar ve ad içeren bir satır oluşturur. Modifier.fillMaxWidth() bileşeni tam genişliğe uzatır, .padding(16.dp) dolgu ekler. MaterialTheme.typography.titleMedium, sistem Material 3 stilini kullanır. name veya avatarUrl parametreleri değiştiğinde, Compose UserProfile'ı yeniden oluşturur — bileşeni yeni değerlerle yeniden oluşturur.

Jetpack Compose'da State ve Recomposition

State Compose'da, değişikliği bağımlı @Composable fonksiyonların yeniden oluşturulmasını (yeniden başlatılmasını) tetikleyen herhangi bir değerdir. Temel yaklaşım, Compose'un snapshot sistemini destekleyen bir MutableState<T> oluşturan mutableStateOf() işlevidir. Snapshot, değişiklik izleme mekanizmasıdır: State'e yazıldığında, Compose geçerli Snapshot'ı kirli (dirty) olarak işaretler ve yeniden oluşturma zamanlayıcısı yalnızca bu State'i okuyan Composable fonksiyonları yeniden başlatır. Gözlemlenebilir koleksiyonlar için mutableStateListOf() ve mutableStateMapOf() kullanın. Compose, Kotlin Flow için collectAsState() ve LiveData için observeAsState() aracılığıyla Lifecycle-Aware bileşenlerden State'i destekler.

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, mutableStateOf() aracılığıyla depolanan liked (Boolean) ve count (Int) durumuna sahip bir "Like" düğmesi oluşturur. Basıldığında, liked tersine çevrilir ve sayaç artar/azalır — Compose, LikeButton'ı otomatik olarak yeniden oluşturur. by delegesi, State'i normal bir değişken gibi kullanmaya izin verir: liked.value = !liked.value yerine liked = !liked. Düğme rengi, primary (beğenildi) ve surfaceVariant (beğenilmedi) arasında tepkisel olarak değişir.

remember: Yeniden Oluşturmalar Arasında Önbellekleme

remember — yeniden oluşturmalar arasında bir değeri önbelleğe alan Compose fonksiyonu. remember olmadan, bir Composable fonksiyonun her yeniden başlatılışı yeni bir durum (mutableStateOf) oluşturur — bu, uygulama mantığını bozar: ekran döndürme veya üst State değişikliğinde sayaç sıfırlanır. remember bir hesaplama lambda'sı alır ve değeri yalnızca ilk oluşturmada hesaplar; sonraki oluşturmalarda önbelleğe alınmış sonucu döndürür. Önbelleği sıfırlamak için remember(key) kullanın — anahtar, değerin ne zaman yeniden hesaplanacağını belirler. remember(key1, key2) herhangi bir anahtar değiştiğinde yeniden hesaplar. Uzun ömürlü durumlar (ekran döndürmeye dayanan) için rememberSaveable kullanın — SavedStateHandle aracılığıyla Bundle'a kaydeden remember benzeri bir işlev.

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 = "Elapsed: ${seconds}s",
            style = MaterialTheme.typography.displayMedium
        )
    }
}

rememberSaveable, ekran döndürmede (yapılandırma değişikliği) seconds değerini korur. LaunchedEffect, her saniye seconds değerini artıran bir coroutine başlatır. TimerScreen'in yeniden oluşturulmasında (her saniye) rememberSaveable sayesinde seconds sıfırlanmaz. Yapılandırma değişikliklerine dayanmaması gereken durumlar için (örneğin, animasyon bayrakları) normal remember kullanın.

Modifier: Composable Ayar Zinciri

Modifier — Composable bileşenlerin görünümünü, davranışını ve düzenini yapılandırmak için Builder desenini uygulayan değişmez bir kapsayıcı nesnedir. Her Modifier yöntemi çağrısı (.padding(), .width(), .clickable(), .background()) eklenen öğeyle birlikte yeni bir Modifier döndürür. Değiştirici sırası önemlidir: .padding(16.dp).clickable { } — dolgu, tıklama işleyicisinden önce uygulanır, clickable dolgu dahil tüm alanı izler. .clickable { }.padding(16.dp) — dolgudan önceki tüm alan tıklanabilirdir, dolgu içeriği içe doğru kaydırır. Modifier, then(otherModifier) aracılığıyla özel uygulamaları ve üst ayarlara erişmek için compositionLocal'i destekler.

kotlin
@Composable
fun CardExample() {
    Card(
        modifier = Modifier
            .fillMaxWidth()
            .padding(16.dp)
            .clickable { println("Card clicked") },
        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 ve Modifier ile Android için Bildirimsel UI",
                style = MaterialTheme.typography.bodyMedium
            )
        }
    }
}

CardExample, Modifier zincirini gösterir: fillMaxWidth + padding + clickable. Card, kendi elevation ve colors ayarlarına sahip bir Material3 bileşenidir. İç içe Column'un iç dolgusu 16dp'dir. Compose Material3, Android 12+ üzerinde Dynamic Color (Material You) için renkleri otomatik olarak uyarlar. Card, Compose'daki 30+ yerleşik Material3 bileşeninden biridir.

State hoisting ve Compose Mimarisi

State hoisting — durumu bir Composable fonksiyondan onu çağırana yükselterek fonksiyonu durumsuz (stateless) hale getiren bir desendir. Durumsuz bir bileşen, State'e kendisi sahip olmadan parametreler aracılığıyla veri ve geri çağrılar alır. Bu, yeniden kullanılabilirliği ve test edilebilirliği artırır: bileşen farklı State'lerle çağrılabilir ve ön izlemede test edilebilir. Google, mimariyi önerir: ViewModel + StateFlow (veya MutableStateFlow) + Compose'da collectAsState(). ViewModel durumu ekran düzeyine yükseltir, Compose bunu işler. Yan etkiler (LaunchedEffect, DisposableEffect) tek seferlik olayları işler.

BileşenSorumlulukTeknoloji
ViewModelState depolama, iş mantığıStateFlow, MutableStateFlow
Screen ComposableEkran organizasyonu, State hoistingcollectAsState(), Scaffold, LazyColumn
Stateless ComponentDurumsuz UI, saf işleme@Composable parametreler + lambdalar
Side EffectTek seferlik eylemler (snackbar, navigasyon)LaunchedEffect, SnackbarHostState

Sıkça Sorulan Sorular

Jetpack Compose, XML düzeninden nasıl farklıdır?

XML düzeni zorunludur: LayoutInflater XML'i yükler, findViewById Views bulur, geliştirici metni/listeleri manuel olarak günceller. Compose bildirimseldir: UI, Kotlin @Composable fonksiyonlarıyla tanımlanır ve framework, State değiştiğinde yalnızca değişen kısımları otomatik olarak yeniden çizer. Compose, UI kodu hacmini %30–50 oranında azaltır ve XML kullanmaz.

Compose'da gezinme için ayrı bir kütüphane gerekli mi?

Evet, Google Navigation Compose sağlar — ekranlar arasında bildirimsel gezinme için bir kütüphane. NavController rota yığınını yönetir, composable() ekranları kaydeder, navArgument parametreleri iletir. Alternatifler: Voyager (community) ve Decompose (Badoo). Navigation Compose, derin bağlantılar ve type-safe argüman desteğiyle resmi standarttır.

Jetpack Compose'da Modifier nedir?

Modifier, Composable bileşenlere uygulanan dekorasyon desenlerinin (padding, size, clickable, background, border, clip) değişmez bir kapsayıcısıdır. Her çağrı, eklenen öğeyle birlikte yeni bir Modifier döndürür. Sıra önemlidir: .padding().clickable() tıklamadan önce dolgu uygular, .clickable().padding() — tam tersi. Modifier, Compose bileşenlerini özelleştirmenin birincil yoludur.

Compose tüm Android sürümlerinde çalışır mı?

Jetpack Compose, Compose Compiler ve Compose BOM aracılığıyla Android API 21+ (Android 5.0 Lollipop) desteği sağlar. Material 3 (Dynamic Colors) Android 12+ üzerinde kullanılabilir; eski sürümlerde yedek palet kullanılır. Yeni projeler için Google, minSdk 24+ (Android 7.0) önerir ve bu, Compose tarafından tamamen karşılanır.

Compose bileşenleri nasıl test edilir?

Google Compose UI Test sağlar — JVM (Masaüstü) ve emülatörde test etmek için bir kütüphane. Ana işlevler: composeTestRule.setContent { } bileşeni işlemek için, onNodeWithText() öğeleri bulmak için, performClick()/performTextInput() eylemler için. Espresso testleri, ComposeTestRule aracılığıyla Compose ile uyumludur, ancak Compose UI Test tercih edilen ve daha hızlı yaklaşımdır.

Özet

  • Jetpack Compose — XML yerine Kotlin @Composable fonksiyonları kullanan, Android için Google'ın bildirimsel UI framework'ü (2021'den beri kararlı).
  • @Composable — Kotlin fonksiyonunu UI bileşenine dönüştüren ek açıklama; Composable fonksiyon ağacı, View hiyerarşisinin yerini alır.
  • State ve mutableStateOf — Snapshot sistemi aracılığıyla Compose tepkiselliğinin temeli; yeniden oluşturma yalnızca bağımlı fonksiyonları etkiler.
  • remember yeniden oluşturmalar arasında değeri önbelleğe alır; rememberSaveable, yapılandırma değişikliklerinde State'i korur.
  • Modifier — değişmez bir kapsayıcı oluşturan ayar zinciri (padding, size, clickable, background); değiştirici sırası önemlidir.
  • State hoisting — durumsuz bileşenler için durumu yukarı taşıma deseni; ViewModel + StateFlow + collectAsState() önerilen mimaridir.
  • Material 3 Dynamic Colors (Android 12+) ile cihaz duvar kağıdına otomatik uyum sağlayan Compose'un standart temasıdır.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun