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)
SavedStateHandleilə 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.
// 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
DefaultLifecycleObserveryaz (məs. sadə sessiya taymeri) vəlifecycle.addObserverilə 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
- ViewModel icmalırəsmideveloper.android.com
- LiveData icmalırəsmideveloper.android.com
- Lifecycle-aware komponentlərrəsmideveloper.android.com