MutableState — müşahidə olunan vəziyyət və Compose-də yeniləmə mexanizmi

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

MutableState — Jetpack Compose-da dəyişən müşahidə olunan dəyər üçün konteyner təmsil edən interfeysdir. O, Compose-un reaktiv sisteminin əsasını təşkil edir: MutableState-in dəyəri setter vasitəsilə hər dəfə dəyişdikdə, Compose Runtime bütün oxuyan komponentləri xəbərdar edir və rekombinasiyanı işə salır. Google Android Developers, 2026-ya görə, MutableState-i başa düşmək deklarativ UI-də vəziyyətlə düzgün işləmək üçün məcburidir.

Əsas məqamlar

  • MutableState — compose.runtime interfeysi, bir value xassəsi (getter + setter)
  • State — yalnız oxumaq üçün ana interfeys, MutableState yazma imkanı əlavə edir
  • Rekombinasiya aktiv snapshot dövrü daxilində value setteri çağırıldıqda işə düşür
  • SnapshotMutationPolicy dəyişikliyin rekombinasiya üçün əhəmiyyətli hesab edildiyi anı müəyyən edir
  • MutableIntState və analoqları — MutableState-in optimallaşdırılmış primitiv versiyaları

Jetpack Compose-da MutableState nədir

MutableState — androidx.compose.runtime paketindən bir interfeysdir, bir xassə elan edir: override var value: T. Getter cari dəyəri qaytarır, setter yenini yazır və Compose Runtime-a dəyişiklik barədə məlumat verir. İnterfeys State<T>-dən miras alır, burada value yalnız oxumaq üçün əlçatandır. Belə iki səviyyəli arxitektura girişi ayırmağa imkan verir: yalnız dəyəri oxumağa ehtiyacı olan komponent State<T> alır, sahib komponent isə — MutableState<T>.

MutableState-in standart tətbiqi daxili sinif olan SnapshotMutableStateImpl-dir, dəyişiklikləri izləmək üçün snapshot mexanizmindən istifadə edir. Value setteri çağırıldıqda, cari snapshot yazını qeyd edir və bütün qeydiyyatdan keçmiş ObservedScope-ləri (müşahidə sahələri) etibarsız olaraq işarələyir. Bu sahələr (adətən Composable funksiyaları) növbəti kadrda yenidən tərtib olunacaq. Bütün proses Lock-free snapshot arxitekturası sayəsində sinxron və bloklanmadan baş verir.

State vs MutableState: State — komponentlərin ictimai API-ləri üçün istifadə olunan yalnız oxumaq üçün interfeysdir. Composable funksiyasının parametrini State<Int> kimi elan etdikdə, komponentin oxuya biləcəyinə, lakin vəziyyəti dəyişə bilməyəcəyinə zəmanət verirsiniz. MutableState sahib komponent daxilində istifadə olunur. Belə ayırma — Compose-un əsas təcrübələrindən biridir, icazəsiz dəyişikliklərin qarşısını alır.

State, MutableState və törəmə interfeyslərin iyerarxiyası

Compose-da vəziyyət interfeyslərinin iyerarxiyası bir neçə səviyyəyə malikdir. Zirvədə — yalnız oxumaq üçün value ilə State<T>. Aşağıda — oxumaq və yazmaq üçün value ilə MutableState<T>. Daha sonra ixtisaslaşdırılmış primitiv versiyalar gəlir: MutableIntState, MutableFloatState, MutableLongState, MutableBooleanState və digərləri, primitivlərin avtomatik qablaşdırılmasından (boxing) qaçır.

MutableDoubleState və MutableLongState — daha az yayılmış, lakin mövcud olan növlər. Kolleksiya interfeysləri: MutableListState — siyahı daxilində dəyişiklikləri izləmək üçün, MutableStateMap — xəritələr üçün. Bu interfeyslərin hər biri konkret ssenari üçün optimallaşdırılıb və əsas MutableState-i kolleksiya ilə iş üçün əlavə metodlarla genişləndirir.

SnapshotStateList və SnapshotStateMap — snapshotlarla uyğunluğu olan dəyişdirilə bilən siyahı və xəritələrin tətbiqləridir. Onlar təkcə dəyərin əvəz edilməsini deyil, həm də daxili dəyişiklikləri izləməyə imkan verir: siyahıya elementin əlavə edilməsi, silinməsi, mövcud elementin dəyişdirilməsi. Belə strukturlar üçün mutableStateListOf() və mutableStateMapOf() müvafiq müşahidə olunan kolleksiyalar yaradır.

İnterfeysTəyinatYaratma metodu
State<T>Yalnız oxumaq üçün konteyner
MutableState<T>Oxumaq və yazmaq üçün konteynermutableStateOf()
MutableIntStateBoxingsiz primitiv IntmutableIntStateOf()
MutableFloatStateBoxingsiz primitiv FloatmutableFloatStateOf()
SnapshotStateListMüşahidə olunan siyahımutableStateListOf()
SnapshotStateMapMüşahidə olunan xəritəmutableStateMapOf()

SnapshotMutationPolicy: rekombinasiya nə vaxt işə salınmalıdır

SnapshotMutationPolicy — MutableState dəyişikliyinin nə vaxt əhəmiyyətli hesab edildiyini müəyyən edən interfeysdir. mutableStateOf ikinci arqument olaraq policy qəbul edir. Standart tətbiqlər: structuralEquality() (equals), referentialEquality() (===), neverEqualPolicy() (həmişə dəyişikliyi qəbul edir). Öz məntiqiniz üçün öz policy-nizi tətbiq edə bilərsiniz.

structuralEquality() — standart davranış. Compose yeni dəyəri köhnə ilə equals() vasitəsilə müqayisə edir. Nəticə true olarsa — rekombinasiya BAŞLAMIR. Bu, primitivlər və data klassları üçün əlverişlidir, burada eyni sahələrə malik iki nümunə bərabər sayılır. Problem: data class List ehtiva edərsə, equals() dərin müqayisə aparır, bu da böyük siyahılar üçün bahalı ola bilər.

referentialEquality() — referansları === vasitəsilə müqayisə edir. Rekombinasiya yalnız fərqli bir obyekt təyin edildikdə işə salınır, məzmun eyni olsa belə. Bu, hər bir yeni nümunənin dəyişiklik demək olduğu dəyişməz data klassları üçün optimaldır. neverEqualPolicy() — həmişə dəyişikliyi əhəmiyyətli hesab edir, müqayisə aparmadan. Setter nadir hallarda çağırıldıqda və equals-ə vaxt sərf etmək lazım olmadıqda faydalıdır.

kotlin
    // Təcrübədə siyasətlərin müqayisəsi
data class User(val name: String, val age: Int)

@Composable
fun UserProfile() {
    // structuralEquality: rekombinasiya YALNIZ məlumat dəyişdikdə
    var user1 by remember {
        mutableStateOf(User("Alice", 30))
    }

    // referentialEquality: rekombinasiya HƏR təyinatda
    var user2 by remember {
        mutableStateOf(User("Bob", 25),
            SnapshotMutationPolicy.referentialEquality())
    }

    // user1: copy() eyni sahələrlə rekombinasiyanı TƏTİKLƏMİR
    // user2: hətta user2.copy() == user2 rekombinasiyanı tətikləyir (yeni ref)
}

Primitiv State: MutableIntState, MutableFloatState, MutableLongState

Primitiv MutableIntState və analoqları — primitivləri avtomatik qablaşdırma (boxing) olmadan saxlayan ixtisaslaşdırılmış interfeyslərdir. Adi MutableState<Int> Int-i Integer kimi saxlayır, hər yazışda yığında obyekt yaradır. MutableIntState int (primitiv) saxlayır, qablaşdırma yükünü tamamilə aradan qaldırır. Bu, yüksək tezlikli yeniləmələrdə xüsusilə vacibdir — sayğaclar, scroll mövqeləri, animasiya dəyərləri.

mutableIntStateOf(), mutableFloatStateOf(), mutableLongStateOf() — primitiv MutableState yaradan funksiyalar. İnterfeyslər MutableIntState, MutableFloatState, MutableLongState adlanır. Onlar müvafiq olaraq MutableState<Int>, MutableState<Float> və MutableState<Long>-i genişləndirir, primitivə sürətli giriş üçün intValue xassəsini əlavə edir. Onların daxili tətbiqində lock-free oxuma/yazma üçün AtomicInteger istifadə olunur.

Tətbiq: sayğaclar (Int), scroll mövqeləri (Float offset), vaxt damğaları (Long). Gündəlik ssenarilərin əksəriyyətində performans fərqi nəzərə çarpmır, lakin minlərlə elementi olan LazyList və keçid animasiyalarında primitiv State nəzərəçarpacaq artım verir. Google tipik ssenarilər üçün universal mutableStateOf əvəzinə primitiv State-dən istifadə etməyi tövsiyə edir.

kotlin
@Composable
fun ScrollCounter() {
    // Pis: hər yeniləmədə qablaşdırma
    var badCount by remember { mutableStateOf(0) }

    // Yaxşı: qablaşdırma yoxdur, primitiv saxlama
    var goodCount by remember { mutableIntStateOf(0) }

    // İstifadə eynidir
    Button(onClick = { goodCount++ }) {
        Text("Count: $goodCount")
    }
}

MutableState ilə işin praktiki nümunələri

TodoList komponentinə baxaq, burada MutableState iki formada istifadə olunur: giriş vəziyyəti üçün ayrıca dəyişənlər və dinamik tapşırıq siyahısı üçün SnapshotStateList. Hər ikisi kodun yığcamlığı üçün delegasiyadan istifadə edir.

kotlin
data class TodoItem(val id: Int, val text: String, val isDone: Boolean = false)

@Composable
fun TodoScreen() {
    var inputText by remember { mutableStateOf("") }
    val items = remember { mutableStateListOf() }

    Column(modifier = Modifier.padding(16.dp)) {
        Row {
            TextField(
                value = inputText,
                onValueChange = { inputText = it }
            )
            Button(onClick = {
                if (inputText.isNotBlank()) {
                    items.add(TodoItem(items.size, inputText))
                    inputText = ""
                }
            }) { Text("Əlavə et") }
        }

        LazyColumn {
            items(items) { item ->
                Row(modifier = Modifier.fillMaxWidth().clickable {
                    val idx = items.indexOf(item)
                    items[idx] = item.copy(isDone = !item.isDone)
                }) {
                    Checkbox(checked = item.isDone, onCheckedChange = null)
                    Text(item.text)
                }
            }
        }
    }
}

mutableStateListOf SnapshotStateList yaradır — ayrı-ayrı elementlərin dəyişikliklərini izləyən dəyişdirilə bilən siyahı. items.add() və items[n] = newValue çağırıldıqda Compose mutasiyanı görür və yalnız dəyişmiş LazyColumn elementlərinin rekombinasiyasını aparır. inputText — adi MutableState<String>. İki MutableState növünün (tək və kolleksiya) kombinasiyası formalar və siyahıları olan ekranlar üçün tipik nümunədir.

Tez-tez verilən suallar

MutableState-dən remember olmadan istifadə etmək olar?

MutableState remember olmadan hər rekombinasiyada yenidən yaradılacaq. Hər yeni mutableStateOf çağırışı yeni obyekt yaradır, köhnə dəyər itir. Həmişə rekombinasiyalar arasında State-i qorumaq üçün remember-dən istifadə edin, əgər State Composable-dən kənarda (məsələn, ViewModel-də) yaradılmayıbsa.

MutableState-i adi dəyişənə necə çevirmək olar?

.value-ni snapshot-dan kənarda snapshot { } vasitəsilə bir dəfə oxuyun. Lakin bu reaktivliyi söndürür — dəyişikliklər artıq rekombinasiyanı çağırmayacaq. Abunə olmadan birdəfəlik oxumaq üçün oxumadan snapshot daxilində currentValue() istifadə edin.

Hansı daha sürətlidir: mutableStateOf yoxsa mutableIntStateOf?

mutableIntStateOf daha sürətlidir, çünki int-in Integer-ə qablaşdırılmasını tələb etmir. Saniyədə minlərlə yeniləmədə (animasiya, scroll) fərq ayırma vaxtının 30-50%-nə çata bilər. Nadir yeniləmələrdə (kliklər, mətn daxil etmə) fərq əhəmiyyətsizdir.

MutableState-i Composable funksiyasının arqumenti kimi istifadə etmək olar?

İstifadə etmək olar, lakin tövsiyə edilmir. MutableState əvəzinə State (yalnız oxumaq) + onValueChange lambdası ötürün. Bu, State Hoisting nümunəsini həyata keçirir və komponenti təkrar istifadə oluna bilən edir. MutableState qəbul edən komponentlər biristiqamətli məlumat axınını pozur.

MutableState-in xüsusi tətbiqini necə yaratmaq olar?

MutableState interfeysini tətbiq edin və getter və setter ilə override var value təmin edin. Setterdə validasiya və ya loglama əlavə edə bilərsiniz. Compose Runtime ilə geriyə uyğunluq üçün tətbiqinizi snapshotFlow ilə sarın və ya snapshotIncrement istifadə edin.

Nəticə

  • MutableState — Compose-da dəyişən müşahidə olunan vəziyyət üçün əsas interfeys
  • State — dəyişdirmə hüququ olmadan məlumat ötürmək üçün yalnız oxumaq versiyası
  • SnapshotMutationPolicy dəyişiklik zamanı rekombinasiyanın işə salınma şərtlərini idarə edir
  • Primitiv State (MutableIntState və s.) avtomatik qablaşdırma yükünü aradan qaldırır
  • SnapshotStateList və SnapshotStateMap kolleksiyaların daxili dəyişikliklərini izləyir
  • Rekombinasiya value setterinin hər çağırışında avtomatik işə salınır
  • Tövsiyə: vəziyyətə sahib olmaq üçün MutableState, aşağı ötürmək üçün State istifadə edin

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