Jetpack Compose: nedir, temel kavramlar ve Composable işlevler

Yazar: IT Sectr Yayınlanma: 2026-05-01 Okuma süresi: 9 dk

Jetpack Compose, Kotlin ile Android arayüzleri oluşturmak için modern bir bildirimsel araç takımıdır. Geliştirici, composable işlevler aracılığıyla UI'yı tanımlar ve araç takımı yalnızca değişen kısımları otomatik olarak yeniden çizer. Android Developers (2026)'a göre, Jetpack Compose Android 5.0 (API 21) ve üzerinde çalışır, Material Design 3'ü destekler ve kendi Recomposition sistemi sayesinde orta segment cihazlarda 120 FPS'ye ulaşır — yalnızca değişen widget'ları güncelleyen akıllı bir diff algoritması.

Önemli Noktalar

  • Jetpack Compose — Android için bildirimsel bir UI çerçevesi; arayüz, Kotlin'de @Composable ek açıklamalı işlevler aracılığıyla oluşturulur.
  • Recomposition — yalnızca verileri değişen bileşenleri otomatik olarak güncelleyen ve 120 FPS sağlayan bir mekanizma.
  • State, mutableStateOf, collectAsState ve StateFlow aracılığıyla yönetilir — değer değiştiğinde, bağımlı görünümler için kompozisyon yeniden başlatılır.
  • Modifier — sınıf kalıtımı olmadan dolgu, boyut, arka plan, tıklama ve animasyonları yapılandırmak için bir işlev zinciri.
  • Side Effects — LaunchedEffect, DisposableEffect ve rememberCoroutineScope — zamanlayıcılar, ağ istekleri, abonelikler gibi yan etkileri yönetir.

Jetpack Compose nedir?

Jetpack Compose, Google tarafından Android kullanıcı arayüzleri oluşturmak için 2019'da duyurulan ve 2021'de kararlı sürüme ulaşan bildirimsel bir çerçevedir. Eski View System'den (XML düzeni + Activity/Fragment) farklı olarak Compose, ek açıklamalı Kotlin işlevlerini — @Composable — kullanır. Arayüz tamamen Kotlin'de tanımlanır: XML ve kod arasında ayrım yoktur. Bu, XML ve Kotlin'de uyuşmayan ID'lerle ilgili hata sınıfını ortadan kaldırdı (type-safe synthetic yeniden düzenlemede yardımcı olmuyordu).

Compose, View hiyerarşisine bağlı olmayan kendi işleme sistemi Canvas üzerine inşa edilmiştir. Her Composable, View System'in onMeasure/onDraw'ını atlayarak doğrudan Canvas üzerine çizilir. Bu, karmaşık ekranlarda performans artışı sağlar: Google testlerinde (2023), 200 öğeli bir Compose ekranı, RecyclerView + ViewHolder üzerindeki benzer bir ekrandan %40 daha hızlı işlenmiştir.

Minimum Gereksinimler ve Uyumluluk

Compose, minSdk 21 (Android 5.0) ve Kotlin 1.9+ gerektirir. Compose BOM (Bill of Materials), tüm Compose kütüphanelerinin sürümlerini senkronize eder. Çerçeve, mevcut View System koduyla uyumludur: Compose, XML düzenlerinde ComposeView aracılığıyla, eski View'lar ise Compose hiyerarşisinde AndroidView aracılığıyla gömülür. Google Play Console'a (2025) göre, Android 5.0+ aktif cihazların %97'sini kapsar, bu nedenle uyumluluk çoğu proje için bir sınırlama değildir.

Composable işlevler ve kompozisyon

@Composable, sıradan bir Kotlin işlevini UI yapı taşına dönüştüren bir ek açıklamadır. Bir Composable işlevi, arayüzün bir parçasının nasıl görünmesi gerektiğini tanımlar — metin, düğme, liste. Bir değer döndürmek yerine, işlev kompozisyona UI bileşenleri yayar (emit). Bu bir üretece benzer: her işlev çağrıldığında ekrana öğeler ekler.

kotlin
@Composable
fun ProfileCard(name: String, avatarUrl: String) {
    Card(
        modifier = Modifier.fillMaxWidth().padding(16.dp),
        colors = CardDefaults.cardColors(
            containerColor = MaterialTheme.colorScheme.surface
        )
    ) {
        Row(verticalAlignment = Alignment.CenterVertically) {
            AsyncImage(
                model = avatarUrl,
                contentDescription = "Avatar",
                modifier = Modifier.size(48.dp).clip(CircleShape)
            )
            Spacer(Modifier.width(12.dp))
            Text(
                text = name,
                style = MaterialTheme.typography.titleMedium
            )
        }
    }
}

ProfileCard işlevi parametreler (name, avatarUrl) alır ve Card → Row → AsyncImage + Text yayar. Kompozisyon, tek bir geçişte yayılan bileşenlerin ağacıdır. Parametreler değişmediyse, Compose işlev çağrısını atlar (recomposition skip). Yalnızca name değiştiyse, yalnızca Text çağrılır, diğer öğeler yeniden çizilmez. Bu akıllı yeniden kompozisyon, Compose'un manuel View System optimizasyonuna göre temel performans avantajıdır.

Slotlar ve Content Lambda

Composable işlevler, slotları (trailing lambda, content: @Composable (() -> Unit)) aktif olarak kullanır. Bu, kapsayıcılar oluşturmayı sağlar: Card, Column, Row bir content lambda kabul eder ve içerik slota gömülür. Slot API, android:layout_gravity gibi XML niteliklerinin yerini aldı — artık alt öğelerin konumlandırılması, içerik bloğu içindeki Kotlin koduyla ayarlanır.

Compose'da durum yönetimi

Compose'da Durum (State), zaman içinde değişebilen herhangi bir değerdir. Durum değiştiğinde, Compose bu durumu okuyan tüm bileşenler için yeniden kompozisyon planlar. Mekanizma React hook'larına benzer: mutableStateOf, MutableState<T> döndürür, .value okumak mevcut kompozisyonu otomatik olarak değişikliklere abone eder.

kotlin
@Composable
fun CounterExample() {
    var count by remember { mutableStateOf(0) }

    Column(modifier = Modifier.padding(16.dp)) {
        Text("Tıklandı: $count")
        Button(onClick = { count++ }) {
            Text("Artır")
        }
    }
}

@Composable
fun UserScreen(viewModel: UserViewModel) {
    val userName by viewModel.userName.collectAsState()
    Text("Kullanıcı: $userName")
}

remember, yeniden kompozisyonlar arasında değeri korur — aksi takdirde mutableStateOf her UI güncellemesinde yeniden oluşturulur. collectAsState(), ViewModel'deki StateFlow'u Compose uyumlu duruma dönüştürür. Öneri — ekran düzeyindeki durum için ViewModel ile StateFlow'u, yerel durum (örneğin, genişletilmiş kart) için mutableStateOf'u kullanın. Bu ayrım, akıllı/aptal bileşen ilkesini izler.

State Hoisting (Durum Kaldırma)

State Hoisting, durumu alt bileşenden üst bileşene yükseltme modelidir. Üst, parametreler aracılığıyla değeri ve bir geri çağrıyı iletir, alt değişiklikte geri çağrıyı çağırır. Üst, mutableStateOf tutar, alt yalnızca parametreleri tutar. Bu, bileşeni yeniden kullanılabilir ve test edilebilir yapar: aynı TextField herhangi bir veri kaynağıyla kullanılabilir.

Modifier — görünüm özelleştirme

Modifier, Composable dönüşümlerini (boyut, dolgu, arka plan, tıklama işleme, animasyon, kaydırma) tanımlayan bir nesnedir. Değiştiriciler, bir çağrı zinciri aracılığıyla uygulanır: Modifier.fillMaxWidth().padding(16.dp).background(Color.Blue).clickable { }. Her çağrı, eklenen özellikle birlikte yeni bir Modifier döndürür — orijinal nesnede değişiklik olmaz.

Değiştiricilerin sırası önemlidir. Modifier.padding(16.dp).background(Color.Blue) dolgulu alanı renklendirir. Modifier.background(Color.Blue).padding(16.dp) iç dikdörtgeni renklendirir ve dolgu şeffaf kalır. Mekanik, CSS kutu modeline benzer: önce padding → background, margin + background gibi çalışır; önce background → padding, background + iç dolgu gibi çalışır. Geliştiricinin yalnızca şunu hatırlaması yeterlidir: önce padding = dış kenar boşluğu, sonra padding = iç dolgu.

Özel Değiştiriciler

Yerleşik değiştiriciler yeterli değilse, Modifier.composed { ... } veya Modifier.then() aracılığıyla özel bir değiştirici oluşturulur. Özel bir değiştiricinin içinde, düzen ölçümleri (Modifier.layout { measurable, constraints -> ... }), çizim (Modifier.drawWithContent { ... }), hareketler (Modifier.pointerInput { ... }) kullanılabilir. Örnek: tıklamada nabız animasyonu için değiştirici — boyutu ölçer, tıklamada animateFloatAsState aracılığıyla ölçek animasyonu başlatır.

Animasyonlar için Compose, animate*AsState (animateFloatAsState, animateColorAsState, animateDpAsState) sağlar — değerler değişiklikte eski ve yeni durum arasında canlandırılır. Giriş/çıkış animasyonları için — AnimatedVisibility ve AnimatedContent yerleşik geçişlerle (fade, slide, expand) birlikte. Tüm animasyonlar grafik katmanında çalışır ve gereksiz kompozisyonu tetiklemez.

Side Effects: LaunchedEffect, DisposableEffect, remember

Composable işlevler doğrudan yan etkiler (ağ istekleri, zamanlayıcılar, abonelikler) gerçekleştirmemelidir — her yeniden kompozisyonda çağrılırlar ve bu da yinelenen isteklere yol açar. Yan etkiler için Compose, bir Effect işlev ailesi sağlar: LaunchedEffect kompozisyona girişte bir kotlin başlatır ve çıkışta iptal eder, DisposableEffect — açık temizlik gerektiren kaynaklar (sensörler, BroadcastReceiver) için.

kotlin
@Composable
fun SensorReader() {
    val context = LocalContext.current
    var sensorValue by remember { mutableStateOf(0f) }

    DisposableEffect(Unit) {
        val sensor = registerSensorListener(context) { value ->
            sensorValue = value
        }
        onDispose {
            unregisterSensorListener(sensor)
        }
    }

    Text("Değer: $sensorValue")
}

@Composable
fun UserGreeting(userId: String) {
    LaunchedEffect(userId) {
        val profile = api.fetchProfile(userId)
        // durum güncelleme
    }
}

LaunchedEffect(userId), userId değişirse yeniden başlatılır — önceki kotlin iptal edilir ve yeni userId ile yenisi başlatılır. Bu, manuel istek iptal yönetimini ortadan kaldırır. DisposableEffect(Unit) — sabit anahtar Unit'e sahip bir etki, kompozisyona girişte tetiklenir ve çıkışta onDispose'u çağırır. SensorReader bir dinleyici kaydeder ve ekrandan ayrılırken aboneliği iptal eder — sızıntı riski olmadan.

rememberCoroutineScope

Bir kotlinin kompozisyona girişte değil, bir olayda (düğme tıklaması) başlatılması gerekiyorsa, rememberCoroutineScope() kullanılır. Composable yaşam döngüsüne bağlı bir CoroutineScope döndürür ve DisposableEffect gerektirmez. Örnek: düğme tıklamasında ağ isteği başlatma — scope.launch { viewModel.loadData() }.

Jetpack Compose vs View System: karşılaştırma

Compose ve View System arasında seçim yapmak, 2026'da Android geliştiricileri için ana mimari sorudur. Her iki teknoloji de Google tarafından desteklenmektedir, ancak Compose, Google'ın kaynak harcadığı ana yöndür. View System yalnızca kritik düzeltmeler alır ve gelişmemektedir. Fark, sözdizimi, durum yönetimi, performans ve geliştirme süresinde kendini gösterir.

YönJetpack ComposeView System
UI TanımıKotlin @Composable işlevleriXML düzeni + Activity/Fragment
DurummutableStateOf, StateFlow, otomatik yeniden çizimfindViewById, manuel: setText, notifyDataSetChanged
PerformansAkıllı yeniden kompozisyon, Canvas işlemeView hiyerarşisi, measure/layout/draw
Animasyonlaranimate*AsState, AnimatedVisibility, yerleşikValueAnimator, ObjectAnimator, Transition
UyumlulukminSdk 21, ComposeView/AndroidView köprüleriTüm sürümler, herhangi biri
APK BoyutuCompose için +3–5 MBEk yük yok

Yeni projeler için Google, Jetpack Compose'u UI geliştirme standardı olarak önermektedir. View System, 2021'den önce yazılmış kodun bakımı ve APK boyutunun kritik olduğu durumlar (örneğin, giriş seviyesi cihazlara sahip gelişmekte olan pazarlar) için kalmıştır. Compose, bildirimsel sözdizimi ve yerleşik animasyonları sayesinde View System'e kıyasla UI kodu hacmini %30–50 oranında azaltır.

Sıkça Sorulan Sorular

Mevcut bir View System projesinde Compose kullanabilir miyim?

Evet, XML düzeninde ComposeView aracılığıyla. Compose bağımlılığını ekleyin ve ekranı veya bir kısmını ComposeView { MyComposable() } içine sarın. Geçiş ekran ekran yapılır.

Composable'ım neden çok sık yeniden çiziliyor?

Nedeni, durumun çok yükseğe kaldırılması veya değiştirilebilir nesnelerin kullanılmasıdır. Düzeltme: türetilmiş veriler için derivedStateOf ve kararlı referanslar için remember.

Compose'da liste nasıl uygulanır?

LazyColumn kullanın (RecyclerView benzeri). Öğeler kaydırma sırasında oluşturulur ve yeniden kullanılır. Farklı hücre türlerine sahip karmaşık listeler için — LazyColumn { items(items, key = { it.id }) { ... } }.

Compose'dan önce View System öğrenmeli miyim?

Hayır, doğrudan Compose ile başlayabilirsiniz. View System bilgisi eski kodun bakımında yardımcı olur, ancak Compose kendi dokümantasyonu ve modelleri olan bağımsız bir ekosistemdir.

Compose Material 3'ü destekliyor mu?

Evet, Material 3 2023'ten beri Compose'un varsayılan temasıdır. implementation("androidx.compose.material3:material3") aracılığıyla eklenir. Material 2 kullanımdan kaldırılmıştır.

Özet

  • Jetpack Compose — Android için bildirimsel bir UI çerçevesi; tüm arayüz @Composable işlevlerle Kotlin'de yazılır.
  • Recomposition yalnızca değişen bileşenleri otomatik olarak yeniden çizer ve manuel optimizasyon olmadan 120 FPS sağlar.
  • State, mutableStateOf, collectAsState ve StateFlow ile yönetilir; State Hoisting modeli bileşenleri yeniden kullanılabilir yapar.
  • Modifier — sınıf kalıtımı olmadan görünüm, animasyon ve davranışı yapılandırmak için bir dönüşüm zinciri.
  • Side Effects (LaunchedEffect, DisposableEffect) yan etkileri yeniden kompozisyondan ayırarak sızıntıları ve yinelenen istekleri önler.
  • LazyColumn daha az kodla RecyclerView'in yerini alır ve AnimatedVisibility karmaşık Animator zincirlerinin yerini alır.
  • Google tüm yeni projeler için Compose'u önerir; View System eski kod ve APK boyutunun kritik olduğu durumlar için kalı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