remember — Jetpack Compose-da funksiyadır ki, rekompozisiyalar arasında dəyəri saxlamağa imkan verir, Composable funksiyasının hər yenidən işə salınmasında vəziyyətin sıfırlanmasının qarşısını alır. remember olmadan funksiya daxilində elan edilmiş bütün dəyişənlər UI hər yeniləndikdə sıfırlanar, vəziyyəti qeyri-sabit və yararsız edər. Google Android Developers, 2026 məlumatlarına görə, remember-in düzgün istifadəsi deklarativ UI-da vəziyyətin düzgün idarə edilməsinin əsasıdır.
Əsas məqamlar
remember — androidx.compose.runtime paketindən Jetpack Compose-un daxili funksiyasıdır ki, Composable funksiyasının ardıcıl çağırışları arasında öz dəyərini saxlayan obyekt yaradır. Texniki olaraq remember slotlarla işləyir — UI ağacında funksiya çağırışının hər mövqeyi üçün ayrılmış xüsusi yaddaş hüceyrələri. Funksiya kompozisiyanın tərkibində qaldığı müddətcə (if şərti ilə silinməyibsə), remember hər rekompozisiyada saxlanmış dəyəri qaytaracaq.
remember-in sintaksisi sadədir: qıvrım mötərizələr daxilində ilkin dəyərin hesablanması bloku göstərilir. Blok yalnız bir dəfə — funksiyanın ilk kompozisiyasında icra olunur. Bütün sonrakı rekompozisiyalar artıq saxlanmış dəyəri qaytarır, bloku yenidən çağırmır. Lakin açar (key parametri) göstərilibsə, blok açar dəyişdikdə yenidən icra olunur ki, bu da dəyəri giriş məlumatları əsasında yenidən hesablamağa imkan verir.
remember Kotlin sehri deyil — bu, key parametri və hesablama lambdası olan sadə funksiyadır. Onun daxili tətbiqi slotlardan oxumaq və yazmaq üçün Composer-dan istifadə edir. Kotlin kompilyatoru remember çağırışını görərək cari CompositionContext-ə müraciət edən və slotları idarə edən kod yaradır. Bu o deməkdir ki, remember yalnız Composable funksiyası daxilində və ya kompozisiya kontekstində olan başqa funksiyada çağırıla bilər.
Jetpack Compose-da remember-in hər biri öz məqsədi olan üç əsas variantı mövcuddur. Əsas remember dəyəri yalnız cari prosesin yaddaşında saxlayır — ekran döndərildikdə (config change) Compose Composition-u yenidən yaradır və bütün remember dəyərləri sıfırlanır. Konfiqurasiya dəyişiklikləri və prosesin dayandırılması zamanı məlumatların saxlanması üçün rememberSaveable istifadə olunur.
rememberSaveable dəyəri SavedStateHandle və ya Parcelable mexanizmi vasitəsilə Bundle-a serializasiya edir. Bu, ekranın döndərilməsi, "Aktivliyi saxlamayın" çağırışı və hətta tətbiqin müvəqqəti kiçildilməsi zamanı məlumatı qorumağa imkan verir. Lakin rememberSaveable saxlanılan məlumat növünə məhdudiyyətlər qoyur: onlar primitiv, Parcelable, Serializable olmalı və ya Saver konverterini dəstəkləməlidir.
derivedStateOf — bu saxlama mexanizmi deyil, optimallaşdırmadır. Dəyəri digər State obyektləri əsasında hesablanan State yaradır. derivedStateOf mənbə vəziyyətlərin dəyişikliklərinə reaksiya verir, lakin dəyəri yalnız abunəçilər olduqda hesablayır. Əgər cari rekompozisiya derivedStateOf-u oxumursa, hesablama aparılmır ki, bu da tez-tez baş verən, lakin heç kimə lazım olmayan yeniləmələrdə resurslara qənaət edir.
@Composable
fun RememberVariants() {
// 1. Əsas remember: kompozisiyadan çıxana qədər qalır
val createdAt = remember { System.currentTimeMillis() }
// 2. rememberSaveable: ekran döndərməsindən sağ çıxır
var username by rememberSaveable { mutableStateOf("") }
// 3. derivedStateOf: yalnız lazım olduqda hesablanır
val isButtonVisible = remember {
derivedStateOf { username.length() > 3 }
}
Text("Yaradıldı: $createdAt")
TextField(value = username, onValueChange = { username = it })
if (isButtonVisible.value) {
Text("Düymə göstəriləcək")
}
}
remember və rememberSaveable arasında seçim konfiqurasiya dəyişiklikləri zamanı məlumatların saxlanmasının nə qədər kritik olmasından asılıdır. Döndərmə zamanı itirilməsi vacib olmayan müvəqqəti vəziyyətlər üçün (animasiya, cari sürüşdürmə mövqeyi, fokus vəziyyəti) — adi remember kifayətdir. Kritik məlumatlar üçün (formadakı mətn, seçilmiş elementlər, işarə qutuları) — rememberSaveable istifadə edin.
Məhsuldarlıq rememberSaveable adi remember-dan aşağıdır, çünki Bundle-a serializasiya tələb edir. rememberSaveable-i yalnız Activity-nin yenidən yaradılmasından sağ çıxmalı olan məlumatlar üçün istifadə edin. Qalan hər şey üçün — adi remember. Həddindən artıq rememberSaveable istifadəsi ekran döndərmələri və tətbiqlər arasında keçid zamanı yavaşlamalara səbəb olur.
Parcelable və ya Serializable dəstəkləməyən siniflərlə işləyirsinizsə, Saver — obyektin necə saxlanılacağını və bərpa ediləcəyini müəyyən edən konverterdən istifadə edin. Saver bir cüt lambdadan ibarətdir: save (obyekti saxlanıla bilən növə çevirir) və restore (saxlanılmış məlumatlardan obyekti bərpa edir). Standart Saver artıq mutableStateListOf və mutableStateMapOf üçün tətbiq edilmişdir.
| Xüsusiyyət | remember | rememberSaveable |
|---|---|---|
| Rekompozisiyada saxlanma | Bəli | Bəli |
| Döndərmədə saxlanma | Xeyr | Bəli |
| Proses dayandıqda saxlanma | Xeyr | Bəli |
| Növ tələbləri | İstənilən | Parcelable, Serializable, Saver |
| Məhsuldarlıq | Yüksək | Orta |
Tipik ssenarini nəzərdən keçirək — profil redaktə ekranı, burada remember bir neçə məqsəd üçün istifadə olunur: forma sahələrinin vəziyyətinin saxlanması, törəmə dəyərlərin hesablanması və hesablama tələb edən əməliyyatların keşləşdirilməsi.
data class ProfileUiState(
val name: String = "",
val bio: String = "",
val isSaving: Boolean = false
)
@Composable
fun ProfileEditor() {
var state by rememberSaveable { mutableStateOf(ProfileUiState()) }
val isValid = remember {
derivedStateOf { state.name.isNotBlank() && state.bio.length() <= 500 }
}
val bioWarning = remember(state.bio) {
if (state.bio.length() > 400) {
"${500 - state.bio.length} chars left"
} else null
}
Column(modifier = Modifier.padding(16.dp)) {
OutlinedTextField(
value = state.name,
onValueChange = { state = state.copy(name = it) },
label = { Text("Ad") }
)
OutlinedTextField(
value = state.bio,
onValueChange = { state = state.copy(bio = it) },
label = { Text("Haqqında") }
)
bioWarning?.let { Text(it, color = MaterialTheme.colorScheme.error) }
Button(onClick = { /* save */ },
enabled = isValid.value) {
Text("Yadda saxla")
}
}
}
Nümunədə vəziyyət rememberSaveable vasitəsilə saxlanılır — ekran döndərildikdə mətn itməyəcək. isValid derivedStateOf vasitəsilə hesablanır ki, bu da rekompozisiyalarda lazımsız hesablamaların qarşısını alır. bioWarning bio açarla remember istifadə edir — bu bahalı hesablama (isteğe bağlı, nümayiş üçün) yalnız bio dəyişdikdə yenidən hesablanır, hər rekompozisiyada deyil.
Törəmə vəziyyətlər (derived state) — digər State obyektlərindən hesablanan dəyərlərdir. Onları hər rekompozisiyada hesablayıb eyni nəticələrə CPU sərf etmək əvəzinə, remember derivedStateOf ilə dəyəri yalnız mənbələr dəyişdikdə hesablayır. Bu, xüsusilə məlumatların filtrasiyası, çeşidlənməsi və aqreqasiyası üçün faydalıdır.
Açarlarla remember (remember(key) { calculation }) — digər optimallaşdırma mexanizmidir. Əgər açar əvvəlki rekompozisiyadan dəyişməyibsə, hesablama bloku icra olunmur və keşlənmiş dəyər qaytarılır. Bu, yaradılması bahalı olan obyektlərin keşləşdirilməsi üçün əlverişlidir: tarixlərin formatlanması, JSON-un pars edilməsi, böyük dəyişməz kolleksiyaların yaradılması.
@Composable
fun SearchResults(allItems: List<Item>, query: String) {
// derivedStateOf: filtr yalnız giriş məlumatları dəyişdikdə yenidən hesablanır
val filtered = remember {
derivedStateOf {
allItems.filter { it.title.contains(query, true) }
}
}
// remember açar ilə: formatlanmış statistikalar yalnız sorğu dəyişdikdə yenidən hesablanır
val statsText = remember(query) {
"Results for query \"$query\": ${filtered.value.size}"
}
Text(statsText)
LazyColumn {
items(filtered.value, key = { it.id }) { item ->
Text(item.title)
}
}
}
filtered — allItems və ya query dəyişdikdə avtomatik hesablanan derivedStateOf-dur. statsText remember(query) istifadə edir — bahalı sətir formatlaması yalnız axtarış sorğusu dəyişdikdə icra olunur. derivedStateOf və açarlarla remember-in kombinasiyası maksimum məhsuldarlıq verir: törəmə vəziyyət yalnız lazım olduqda hesablanır, mürəkkəb obyektlər isə açar dəyişənə qədər keşləşdirilir.
Tez-tez verilən suallar
Xeyr, remember — compose.runtime paketindən funksiyadır və CompositionContext tələb edir. O, yalnız @Composable funksiyası daxilində və ya Composable-dan çağırılmış başqa funksiya daxilində çağırıla bilər. Kompozisiyadan kənarda məlumat saxlamaq üçün ViewModel istifadə edin.
Açar olmadan remember bloku yalnız bir dəfə — ilk kompozisiyada hesablayır. Bütün sonrakı rekompozisiyalar saxlanmış dəyəri qaytarır. Məlumat dəyişdikdə dəyəri yenidən hesablamaq lazımdırsa, mütləq onları açar kimi göstərin: remember(data) { compute(data) }.
remember-in birbaşa sıfırlanması yoxdur. Yeganə yol — funksiyanı kompozisiyanın tərkibindən çıxarmaq (məsələn, if şərti ilə gizlətmək) və sonra yenidən göstərməkdir. Təkrar daxil olduqda remember bloku yenidən icra olunaraq yeni ilkin dəyər yaradacaq.
remember vəziyyəti Composable funksiyasının slotunda saxlayır və funksiya kompozisiyada olduğu müddətcə yaşayır. ViewModel ekranın lifecycle-i yaşadığı müddətcə yaşayır. ViewModel döndərmə zamanı saxlanılır və biznes məntiqi üçün istifadə olunur. remember — bir funksiyadan kənara çıxmayan lokal UI vəziyyəti üçündür.
Bəli, remember @Preview Composable funksiyalarında düzgün işləyir, çünki Preview tam hüquqlu CompositionContext yaradır. Lakin rememberSaveable Preview-də düzgün işləməyə bilər, çünki SavedStateHandle önayrı mühitində olmaya bilər.
Nəticə
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.
Həm də oxuyun