mutableStateOf: müşahidə olunan vəziyyətin yaradılması və Compose reaktivliyi

Müəllif: IT Sectr Dərc olunub: 2026-06-28 Oxuma vaxtı: 7 dəq

mutableStateOf — Jetpack Compose-da dəyişən müşahidə olunan vəziyyət konteyneri yaradan funksiyadır. Bu konteynerin içindəki dəyər dəyişdikdə, Compose bu vəziyyəti oxuyan bütün komponentlərin rekompozisiyasını avtomatik olaraq işə salır. mutableStateOf olmadan UI məlumat dəyişikliklərində reaktiv şəkildə yenilənə bilməzdi. Google Android Developers, 2026-ya görə, mutableStateOf Compose-da lokal vəziyyət üçün əsas tikinti blokudur.

Əsas məqamlar

  • mutableStateOf Compose Runtime tərəfindən izlənilən MutableState konteyneri yaradır
  • Rekompozisiya bu State obyektinin value-si dəyişdikdə avtomatik işə düşür
  • Delegasiya var vasitəsilə .value-ya müraciət etmədən mutableStateOf istifadə etməyə imkan verir
  • Köklər remember(mutableStateOf)-da lazım deyil — State özü Compose-a dəyişikliklər barədə məlumat verir
  • Snapshot sistemi çoxthread mühitində oxuma ardıcıllığını təmin edir

Jetpack Compose-da mutableStateOf nədir

mutableStateOf — compose.runtime paketindən olan, dəyəri saxlayan və Compose Runtime-a dəyişikliklər barədə məlumat verə bilən MutableState<T> obyekti yaradan funksiyadır. İmzası: fun <T> mutableStateOf(value: T, policy: SnapshotMutationPolicy<T> = structuralEquality()): MutableState<T>. policy parametri dəyişikliyin nə zaman əhəmiyyətli sayıldığını müəyyən edir — struktur bərabərlikdə, referens bərabərlikdə və ya heç vaxt.

MutableState — tək value xassəsi olan interfeysdir: oxumaq üçün getter və yazmaq üçün setter. Setter çağırıldıqda, Compose Runtime dəyişikliyi snapşotda qeyd edir və bu State dəyişənini oxuyan bütün Composable funksiyalarını rekompozisiya tələb edən kimi işarələyir. Bu proses bir snapshot dövrü ərzində sinxron şəkildə baş verir ki, bu da kaskad dəyişikliklər zamanı aralıq vəziyyətləri aradan qaldırır.

Parameter policy — müqayisə zamanı davranışı müəyyən edən mutableStateOf-ın ikinci arqumentidir. structuralEquality() equals()-i yoxlayır — bu standart davranışdır. referentialEquality() === (referens bərabərlik) yoxlayır. neverEqual() hər təyinatı dəyişiklik hesab edir. Policy seçimi eyni dəyər təyin edildikdə rekompozisiyanın işə düşüb-düşməyəcəyinə təsir edir.

mutableStateOf-ın sintaksisi və elan üsulları

Müşahidə olunan vəziyyəti elan etməyin ən sadə yolu — mutableStateOf-ı remember ilə istifadə etməkdir. remember olmadan hər rekompozisiyada yeni State yaradılacaq və bütün əvvəlki dəyişikliklər itəcəkdi. remember, Composable funksiyası kompozisiyanın tərkibində qaldığı müddətcə eyni MutableState-in bir sıra rekompozisiyalardan keçməsini təmin edir.

kotlin
@Composable
fun Counter() {
    // Delegasiyasız: .value vasitəsilə oxuma/yazma
    val count = remember { mutableStateOf(0) }
    Button(onClick = { count.value++ }) {
        Text("Count: ${count.value}")
    }
}

@Composable
fun CounterDelegated() {
    // Delegasiya ilə: var + by = Property Delegation
    var count by remember { mutableStateOf(0) }
    Button(onClick = { count++ }) {
        Text("Count: $count")
    }
}

İki variant arasındakı fərq sintaktikdir. Property Delegation (by) Kotlin konvensiyasından istifadə edir: kompilyator oxuma və yazma üçün getValue() və setValue() çağırışlarını yaradır. Bu, count.value-ya birbaşa müraciətə ekvivalentdir, lakin adi dəyişənlə işləmək kimi görünür. Hər iki variant funksional olaraq eynidir: Compose yazı formasından asılı olmayaraq getterdə oxumanı və setterdə yazmanı izləyir.

FormaKodOxumaYazma
Delegasiyasızval count = mutableStateOf(0)count.valuecount.value = n
Delegasiya iləvar count by mutableStateOf(0)countcount = n

Delegə edilmiş xüsusiyyətlər və var

Kotlin-in delegə edilmiş xüsusiyyətlər mexanizmi — Compose-un xüsusiyyəti deyil, dilin daxili imkanıdır. İstənilən sinif getValue(thisRef, property) və setValue(thisRef, property, value) operatorlarını tətbiq edə bilər, bundan sonra onun nümunəsi by açar sözü ilə istifadə edilə bilər. MutableState məhz belə işləyir: getValue cari dəyəri qaytarır, setValue isə yeni dəyər təyin edir.

Əhəmiyyətli fərq: val və var. mutableStateOf həm val, həm də var-a təyin edilə bilər. Val halında (val count = mutableStateOf(0)) MutableState obyektinin özü dəyişməzdir, lakin onun value xassəsi dəyişdirilə bilər. Var halında (var count by mutableStateOf(0)) delegasiya primitivlə işləmək illüziyası yaradır, lakin əslində setter MutableState-də setValue çağırır. Val və var arasında seçim .value-ya açıq və gizli giriş arasında seçimdir.

State Delegation — kodu sadələşdirən, lakin mexanikanı dəyişməyən sintaktik şəkərdir. Kotlin kompilyatoru var x by mutableStateOf(0)-ı mutableStateOf.getValue() və mutableStateOf.setValue()-ı çağıran getter/setter-ə çevirir. Yaradılan baytkodda by ilə val və var arasında fərq yoxdur — hər ikisi eyni MutableState konteyneri vasitəsilə işləyir.

kotlin
    // Compose State üçün fərdi delegasiya
class ValidatedState<T>(initialValue: T) {
    private val state = mutableStateOf(initialValue)

    operator fun getValue(thisRef: Any?, property: KProperty<*>) = state.value

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
        if (value != state.value) {
            state.value = value
        }
    }
}

@Composable
fun Test() {
    var text by remember { ValidatedState("") }
}

Snapshot sistemi: mutableStateOf daxildə necə işləyir

Snapshot — paralel dəyişikliklər zamanı State oxumasının ardıcıllığını təmin edən Compose Runtime mexanizmidir. Composable funksiyası mutableStateOf oxuduqda, snapshot cari dəyəri qeyd edir. Əgər kompozisiya zamanı başqa bir dəyişiklik eyni State-ə yazırsa, snapshot yazını görür, lakin uyğunsuz məlumatların oxunmasına icazə vermir — oxuma həmişə snapshot-ın başlanğıc anındakı aktual dəyəri qaytarır.

mutableStateOf.value = newValue setteri çağırıldıqda, Compose Runtime dərhal rekompozisiyanı işə salmır. Bunun əvəzinə dəyişiklik cari snapşotda qeydə alınır. Snapshot tətbiq edildikdə (çərçivə sərhəddində), Compose dəyişdirilmiş State siyahısından keçir və oxuyan komponentləri Invalid olaraq işarələyir. Rekompozisiya yalnız növbəti çərçivədə işə salınır. Bu, kaskad dəyişikliklər zamanı UI-nin onlarla dəfə yenidən çəkilməməsini təmin edir.

Qlobal və lokal snapshotlar: standart olaraq mutableStateOf avtomatik tətbiq edilən qlobal snapşotda işləyir. Yan təsirlər olmadan təcrid olunmuş oxuma üçün Snapshot.takeSnapshot() vasitəsilə lokal snapshot yaradıla bilər. Bu, State oxumaq lazım olan, lakin dəyişikliklərə abunə olmaq lazım olmayan Modifier daxilində istifadə olunur. Bu yanaşma performansı optimallaşdırır və gözlənilməz rekompozisiyaların qarşısını alır.

mutableStateOf istifadə nümunələri

Real ssenarini nəzərdən keçirək — üç sahəli giriş forması: email, şifrə və yükləmə statusu. Hər üç sahə mutableStateOf istifadə edir, lakin müxtəlif policy və müxtəlif yerləşmə ilə. email delegasiyadan istifadə edir, şifrə — birbaşa giriş.

kotlin
data class LoginState(
    val email: String = "",
    val password: String = "",
    val isLoading: Boolean = false,
    val error: String? = null
)

@Composable
fun LoginForm(onLogin: (String, String) -> Unit) {
    // Forma üçün tək State, policy = referentialEquality
    var formState by remember {
        mutableStateOf(LoginState(), SnapshotMutationPolicy.referentialEquality())
    }

    val isValid = remember(formState) {
        formState.email.contains("@") && formState.password.length() >= 6
    }

    Column(modifier = Modifier.padding(16.dp)) {
        OutlinedTextField(
            value = formState.email,
            onValueChange = { formState = formState.copy(email = it) },
            label = { Text("Email") }
        )
        OutlinedTextField(
            value = formState.password,
            onValueChange = { formState = formState.copy(password = it) },
            label = { Text("Şifrə") },
            visualTransformation = PasswordVisualTransformation()
        )
        Button(
            onClick = { onLogin(formState.email, formState.password) },
            enabled = isValid
        ) {
            Text("Daxil ol")
        }
    }
}

Bu nümunədə mutableStateOf fərdi LoginState məlumat sinfi və referentialEquality policy ilə istifadə olunur. Bu o deməkdir ki, rekompozisiya yalnız copy() vasitəsilə yeni LoginState nümunəsi təyin edildikdə işə düşəcək. isValid formState əsasında hesablanır və yalnız o dəyişdikdə yenidən hesablanır. Bu yanaşma rekompozisiyalar üzərində dəqiq nəzarət verir: forma sahələrinin hər biri yalnız yeni surət yaratmaqla dəyişir.

Tez-tez verilən suallar

mutableStateOf StateFlow-dan nə ilə fərqlənir?

mutableStateOf — snapshotlar daxilində işləyən Compose-spesifik konteynerdir. StateFlow kotlinx.coroutines.flow-dandır və Compose-a bağlı deyil. mutableStateOf avtomatik rekompozisiya işə salır, StateFlow collectAsState() tələb edir. Composable daxilində UI vəziyyəti üçün mutableStateOf daha üstündür.

mutableStateOf-dan @Composable funksiyalarından kənarda istifadə etmək olar?

Bəli, mutableStateOf Composable funksiyasından kənarda çağırıla bilər, lakin izlənilməyəcək. UI-də reaktivliyin işləməsi üçün State-i Composable daxilində oxumaq lazımdır. Bir çox ViewModel StateFlow vasitəsilə UI-ə vəziyyət ötürmək üçün MutableStateField-dan (mutableStateOf üzərində qurulma) istifadə edir.

State iki thread-dən eyni anda dəyişdirilərsə nə baş verir?

Snapshot sistemi ardıcıllığı təmin edir: hər rekompozisiya snapshot-ın başlanğıc anındakı uyğun vəziyyəti görür. Müxtəlif thread-lərdən dəyişikliklər çərçivə sərhəddində atomik şəkildə tətbiq olunur ki, bu da bir kompozisiya daxilində oxuma zamanı race condition-u aradan qaldırır.

mutableStateOf-u ilkin dəyərə necə sıfırlamaq olar?

Yeni dəyər təyin edin: count.value = 0 (və ya delegasiya ilə count = 0). State-in tam yenidən yaradılması lazımdırsa — remember açar ilə istifadə edin: remember(key) { mutableStateOf(initial) } — açar dəyişdikdə State yenidən yaradılacaq.

mutableStateOf tez-tez dəyişikliklərdə performansa təsir edirmi?

Composer snapshotlardan istifadə edir, dəyişiklikləri qruplaşdırır: bir çərçivədə yüz təyinat olsa belə, rekompozisiya yalnız bir dəfə yerinə yetirilir. Çox tez-tez yeniləmələr (animasiyalar) üçün Animatable və ya animate*AsState istifadə edin — onlar kadr yeniləmələri üçün optimallaşdırılıb.

Nəticə

  • mutableStateOf Compose Runtime tərəfindən izlənilən müşahidə olunan MutableState konteyneri yaradır
  • Delegasiya by vasitəsilə kodu sadələşdirir, lakin State mexanikasını dəyişmir
  • Snapshot sistemi oxuma ardıcıllığını təmin edir və lazımsız rekompozisiyaların qarşısını alır
  • Policy dəyişikliyin nə zaman əhəmiyyətli olduğunu müəyyən edir — structuralEquality, referentialEquality, neverEqual
  • remember Composable daxilində State-in rekompozisiyalar arasında saxlanması üçün məcburidir
  • Tövsiyə: UI vəziyyəti üçün mutableStateOf-u delegasiya ilə, məlumat sinifləri üçün referentialEquality ilə istifadə edin
  • Çəkinin: mutableStateOf-ı remember olmadan yaratmaq — hər təyinat yeni obyekt yaradacaq

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.

Layihəni müzakirə et

Həm də oxuyun