Sparround

ViewModel, LiveData vs StateFlow, lifecycle-aware komponentlər

ViewModel — UI state-in sahibi və biznes məntiqinin UI-a yaxın qatı. Əsas xüsusiyyətləri:

  • Configuration change-i sağ keçir (ViewModelStore mexanizmi ilə)
  • viewModelScope — onCleared-də avtomatik ləğv olunan coroutine scope
  • View-a, Activity context-ə istinad saxlamamalıdır (leak)
  • SavedStateHandle ilə prosesin ölümünə davamlı state

LiveData vs StateFlow — miqrasiya sualı hər müsahibədə var:

  • LiveData: lifecycle-aware avtomatik (STARTED-də çatdırır), Android-a bağlı, operatorları kasıb.
  • StateFlow: zəngin Flow operatorları, KMP-yə uyğun, domain/data layer-də istifadə olunur; lifecycle-awareness üçün repeatOnLifecycle əl ilə lazımdır.

Lifecycle-aware komponentlər (DefaultLifecycleObserver) — komponentin özü lifecycle-a abunə olub start/stop-unu idarə edir; Activity-nin onStart/onStop-unu şişirtmək əvəzinə müşahidəçi özü bilir nə edəcəyini.

kotlin
// Bank tətbiqində avtomatik logout taymeri
class SessionTimeoutObserver(
    private val onTimeout: () -> Unit
) : DefaultLifecycleObserver {

    private var job: Job? = null

    override fun onStart(owner: LifecycleOwner) {
        job = owner.lifecycleScope.launch {
            delay(5 * 60_000)       // 5 dəqiqə hərəkətsizlik
            onTimeout()
        }
    }

    override fun onStop(owner: LifecycleOwner) {
        job?.cancel()
    }
}

// Activity-də bir sətir:
lifecycle.addObserver(SessionTimeoutObserver { navigateToLock() })

Lifecycle-aware komponent: sessiya taymeri özünü idarə edir

ViewModel necə sağ qalır — mexanizmi soruşurlar: Activity recreate olunanda NonConfigurationInstances vasitəsilə ViewModelStore yeni activity instansiyasına ötürülür; ViewModelProvider eyni açarla mövcud ViewModel-i tapıb qaytarır. Yəni "sehr" deyil — store-un daşınmasıdır. ViewModel yalnız istifadəçi ekranı həqiqətən tərk edəndə (finish, back) onCleared alır.

🛠 Tapşırıq

Bir ViewModel yaz: StateFlow<UiState> + SavedStateHandle.

  • Ekranı döndər — state qalır; "Don't keep activities" ilə prosesi öldür — SavedStateHandle-dakı sahə qalır, qalanı itir. İkisini müqayisə et.
  • UI-da repeatOnLifecycle(STARTED) olmadan collect et, tətbiqi arxa plana at və log-un davam etdiyini gör; sonra düzəlt.
  • Bir DefaultLifecycleObserver yaz (məs. sadə sessiya taymeri) və lifecycle.addObserver ilə qoş.

Bitdi sayılır: üç mexanizmin (ViewModel / SavedStateHandle / observer) sərhədini nümunə ilə deyirsənsə.

📚 Mənbələr və sənədlər