Jetpack Compose’a yeni başlayanların en çok zorlandığı konulardan biri durum (state) yönetimi. remember, mutableStateOf ve recomposition kavramları ilk bakışta karmaşık görünse de, doğru zihinsel modelle oldukça sade hâle geliyor.

Compose’da “state” ne demek?

Compose’da bir arayüz, state’in bir fonksiyonudur: state değiştiğinde, o state’e bağlı UI otomatik olarak yeniden çizilir (recomposition). Bunun çalışabilmesi için Compose’un state değişikliğini “görmesi” gerekir — bu da bizi mutableStateOf‘a getirir.

var sayac by remember { mutableStateOf(0) }

Button(onClick = { sayac++ }) {
    Text("Tıklama sayısı: $sayac")
}

remember ne işe yarar?

remember, bir composable yeniden çalıştırıldığında (recomposition) değerin sıfırlanmasını engeller. remember olmadan, her recomposition’da state yeniden oluşturulur ve kullanıcı etkileşimi kaybolur.

Recomposition’ı ne tetikler?

Recomposition, okunan bir State nesnesinin değeri değiştiğinde tetiklenir. Compose, hangi composable’ların hangi state’i “okuduğunu” izler ve yalnızca etkilenen kısımları yeniden çizer — bu da Compose’u performans açısından verimli kılan temel mekanizma.

State’i yukarı taşımak (state hoisting)

İyi bir Compose mimarisinde state, genellikle onu kullanan composable’dan bir üst seviyeye taşınır (state hoisting). Bu, composable’ı stateless ve test edilebilir hâle getirir; state’in tek bir kaynaktan yönetilmesini sağlar.

@Composable
fun Sayac(sayi: Int, onArtir: () -> Unit) {
    Button(onClick = onArtir) { Text("$sayi") }
}

ViewModel ile birlikte kullanım

Ekran seviyesinde state genellikle bir ViewModel içinde tutulur ve StateFlow üzerinden Compose’a aktarılır. Bu, konfigürasyon değişikliklerinde (örneğin ekran döndürme) state’in kaybolmamasını sağlar.

Sonuç

Compose’da durum yönetimini anlamanın anahtarı, “UI = f(state)” prensibini benimsemek. Bu zihinsel modelle, remember, state hoisting ve recomposition gibi kavramlar birbirini tamamlayan parçalar hâline geliyor.