Composable Function, Jetpack Compose'ta kullanıcı arayüzünün temel bir birimidir ve ekranın bir bölümünün nasıl görünmesi ve davranması gerektiğini tanımlar. Bu tür her işlev, @Composable ek açıklamasıyla işaretlenir ve Compose'un bağımlılıkları izlemesine ve veriler değiştiğinde UI'yı otomatik olarak yeniden oluşturmasına olanak tanıyan özel bir bağlamda yürütülür. Google Android Developers, 2026'ya göre, Composable işlevlerinin doğru şekilde oluşturulması, uygulama performansını ve yeniden oluşturma verimliliğini doğrudan etkiler.
Anahtar Noktalar
Composable Function, @Composable ek açıklamasıyla işaretlenmiş Kotlin dilinde bir işlevdir ve kullanıcı arayüzünün bir bölümünü bildirimsel bir şekilde tanımlar. Java kodu veya XML işaretlemesi aracılığıyla View nesneleri oluşturup yapılandırmak yerine, geliştirici verilerin her durumu için UI'nın nasıl görünmesi gerektiğini basitçe yazar.
Composable işlevi ile geleneksel Android View sistemi arasındaki temel fark, güncelleme modelinde yatmaktadır. Klasik yaklaşımda, geliştirici findViewById'i manuel olarak çağırır, setText aracılığıyla metni değiştirir ve setVisibility aracılığıyla görünürlüğü yönetirdi. Composable Function sizi bu rutinden kurtarır: veriler değiştiğinde, sistem hangi işlevlerin yeniden oluşturulması gerektiğini kendisi belirler ve yalnızca bunları yürütür.
Kotlin derleyicisi, @Composable ek açıklamasını işlerken, işlevi oluşturma mekanizmasına entegre eden ek kod üretir. Bu kod, mevcut UI ağacındaki her Composable işlevinin durumunu ve parametrelerini depolayan özel bellek hücreleri olan slotlara okuma ve yazma işlemlerini içerir. Bu entegrasyon sayesinde Compose, hangi işlevlerin hangi verilere bağlı olduğunu bilir.
Composable işlevinin sözdizimi son derece kısadır: fun anahtar sözcüğünden önce @Composable eklemeniz yeterlidir. İşlev herhangi bir parametreyi kabul edebilir, gövdesinde diğer Composable çağrılarını içerebilir ve koşullu UI oluşturma için Kotlin yapılarını (koşullar, döngüler, when ifadeleri) kullanabilir.
@Composable
fun ProductItem(
product: Product,
modifier: Modifier = Modifier,
onAddToCart: () -> Unit
) {
Card(modifier = modifier.padding(8.dp)) {
Row(modifier = Modifier.fillMaxWidth().padding(12.dp),
verticalAlignment = Alignment.CenterVertically) {
Column(modifier = Modifier.weight(1f)) {
Text(text = product.name, style = MaterialTheme.typography.titleMedium)
Text(text = "${product.price}", color = MaterialTheme.colorScheme.primary)
}
Button(onClick = onAddToCart) {
Text("Sepete ekle")
}
}
}
}
Bu örnekte, ProductItem Composable işlevi bir Product nesnesini, bir değiştiriciyi ve bir geri aramayı kabul eder. Üç parametre de değişmezdir, bu da yeniden oluşturma sırasında öngörülebilir davranışı garanti eder. Değiştirici, varsayılan bir değerle parametre olarak iletilir — bu, çağıran tarafın dolgu ve boyutları özelleştirmesine olanak tanıyan standart bir uygulamadır.
Composable işlevinin içinde, yerleşik Material Design bileşenleri (Text, Button, Card, TextField) veya temel ilkeller (Canvas, Layout) kullanılır. Her bileşen, görünüm ve davranışı yapılandırmak için parametrelerin yanı sıra modifier parametresi aracılığıyla bir veya daha fazla değiştirici kabul eder.
Değiştiriciler, bir bileşenin boyutunu, konumunu, olay işlemeyi ve görünümünü değiştiren işlevler zinciridir. Zincirdeki değiştiricilerin sırası önemlidir: clickable.semantics, semantics.clickable'dan farklı çalışır ve padding.background, dolgu dahil hem alanı hem de arka planı boyar ki bu tasarım yaparken kritiktir.
Composable işlevinin içinde, UI bölümlerinin koşullu oluşturulması için if ve when koşullarını ve dinamik listeler için for döngülerini kullanabilirsiniz. Tüm bu yapılar doğal olarak çalışır çünkü Kotlin tam teşekküllü bir programlama dilidir. Ancak, bir koşul veya döngü Composable işlev çağrıları içeriyorsa, bunların da yeniden oluşturmaya katıldığını unutmamak önemlidir.
@Composable
fun ProductList(
products: List<Product>,
modifier: Modifier = Modifier
) {
LazyColumn(modifier = modifier) {
items(products, key = { it.id }) { product ->
ProductItem(
product = product,
onAddToCart = { /* add to cart */ }
)
}
}
}
Birden çok Composable işlevi kullanan bir ürün arama ekranı örneğini ele alalım. Burada tipik kalıplar gösterilmektedir: durumlu bir giriş alanı, liste filtreleme, boş sonuçları işleme ve yükleme.
data class Product(
val id: String,
val name: String,
val price: Double,
val category: String
)
@Composable
fun SearchScreen() {
var query by remember { mutableStateOf("") }
val products = remember(query) { getFilteredProducts(query) }
Column(modifier = Modifier.fillMaxSize().padding(16.dp)) {
OutlinedTextField(
value = query,
onValueChange = { query = it },
label = { Text("Ürünleri ara") },
modifier = Modifier.fillMaxWidth()
)
Spacer(modifier = Modifier.height(16.dp))
when (products) {
is Loading -> CircularProgressIndicator()
is Empty -> Text("Sonuç bulunamadı")
is Result -> LazyColumn {
items(products.items, key = { it.id }) { product ->
ProductItem(product = product, onAddToCart = {})
}
}
}
}
}
Bu örnek, aynı anda birkaç deyimi gösterir: arama sorgusu durumunu korumak için remember, anahtarla filtreleme için remember(query), üç UI durumu için when ve verimli liste oluşturma için LazyColumn. Bu deyimlerin her biri, Compose uygulamaları geliştirmedeki pratik deneyimin sonucudur.
Composable işlevleri, normal Kotlin işlevleri gibi parametreleri kabul eder, ancak önemli bir farkla: bir parametre, @Composable ek açıklamasıyla bir lambda aracılığıyla iletilen başka bir Composable işlevi olabilir. Bu mekanizmaya Slot API denir ve yeniden kullanılabilir kaplar oluşturmanın ana kalıbıdır.
Slot API, geleneksel View sisteminde ViewGroup ve alt View'lerin programatik olarak eklenmesiyle çözülen sorunu çözer. addView yöntemleri yerine Compose, content lambdaları kullanır — @Composable () -> Unit türündeki son parametre. Çağıran, bu lambda'ya herhangi bir UI iletir ve kap yalnızca düzenini tanımlar.
Composable işlev parametreleri varsayılan değerlere sahip olabilir, bu da onların farklı bağlamlarda kullanımını basitleştirir. Önerilen, işlevin görevini yerine getiremeyeceği parametreleri zorunlu kılmak ve geri kalanı için makul varsayılan değerler sağlamaktır.
| Parametre | Tür | Örnek |
|---|---|---|
| Zorunlu | Herhangi bir tür | name: String |
| İsteğe bağlı | Varsayılan değerle | modifier: Modifier = Modifier |
| Content | @Composable () -> Unit | content: @Composable () -> Unit |
| Callback | @Composable olmadan Lambda | onClick: () -> Unit |
Compose topluluğunda, Composable işlevlerini daha okunabilir ve öngörülebilir kılan birkaç yerleşik deyim ortaya çıkmıştır. Birincisi State Hoisting'dir: durum daha yüksek bir seviyeye yükseltilir ve Composable işlevi bunu parametreler aracılığıyla alır. Bu, işlevi saf hale getirir ve farklı bağlamlarda yeniden kullanılabilir kılar.
İkinci deyim Event-driven parametreleridir. Composable işlevine ViewModel veya useCase iletmek yerine, yalnızca belirli geri aramalar iletilir: onSave, onDelete, onNavigateToDetail. Bu, bağlantıyı azaltır ve test etmeyi basitleştirir.
Üçüncü deyim, oluşturma ağacı aracılığıyla paylaşılan verileri iletmek için CompositionLocal'dir. Tema, ekran yoğunluğu, mevcut Route — bunların tümü CompositionLocal aracılığıyla iletilir ve onlarca Composable işlevi boyunca parametre zincirlerinden kaçınılır. Ancak, CompositionLocal kötüye kullanılmamalıdır: açık parametreler her zaman örtük bağımlılıklara tercih edilir.
// State Hoisting: durum üst işleve yükseltildi
@Composable
fun CounterDisplay(
count: Int,
onIncrement: () -> Unit
) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Text(text = "Sayaç: $count", style = MaterialTheme.typography.headlineLarge)
Button(onClick = onIncrement) {
Text("+1")
}
}
}
// State Hoisting ile kullanım
@Composable
fun CounterScreen() {
var count by remember { mutableStateOf(0) }
CounterDisplay(
count = count,
onIncrement = { count++ }
)
}
Sıkça Sorulan Sorular
Evet, return'e izin verilir, ancak dikkatli olunmalıdır. Compose, yeniden oluşturmayı bireysel işlevler düzeyinde optimize eder ve erken return bu optimizasyonu bozabilir. İşlev gövdesi içinde koşullu operatörler if veya when kullanmak daha iyidir.
Kotlin'de Unit boş bir tür değil, bir singleton nesnedir. Composable işlevleri Unit döndürür, bu teknik olarak Unit nesnesinin kendisini döndürdükleri anlamına gelir. Ancak pratikte bunun bir önemi yoktur.
Değiştirilebilir koleksiyonları iletmek mümkündür, ancak kötü bir uygulamadır. Koleksiyon değişirse, nesne referansı aynı kaldığı için Compose bunu bilmez. İzlenen değişiklikler için değişmez listeler veya mutableStateListOf kullanın.
Hata ayıklama için, Layout Inspector ile Android Studio kullanın. Mevcut Composable işlev ağacını, parametre değerlerini ve yeniden oluşturma nedenlerini gösterir. Normal Kotlin hata ayıklayıcısı da çalışır.
Composable işlevi her zaman Unit döndürür, bu nedenle dönüş türü belirtilmez. Başka bir tür döndürmeye çalışmak derleme hatasına neden olur çünkü @Composable ek açıklaması Unit olmayan dönüş türleriyle uyumsuzdur.
Özet
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.
Ayrıca okuyun