Sobes.tech
Middle

Android ilovasida turli holatlarni sealed sinflar yordamida qanday amalga oshirish mumkin?

sobes.tech AI

AIdan javob

Yopiq sinflar, yakuniy holat to'plamini modellashtirish uchun ideal. Har bir kichik holat o'ziga xos ma'lumotlarni o'z ichiga olishi mumkin.

Misol:

sealed class UiState {
    object Loading : UiState() // Ma'lumotlar bo'lmagan yuklanish holati
    data class Success(val data: List<Item>) : UiState() // Olingan ma'lumotlar bilan muvaffaqiyatli holat
    data class Error(val message: String) : UiState() // Xato holati xabar bilan

    object Idle : UiState() // Boshlang'ich yoki neytral holat
}

Qo'llanilishi:

  • ViewModelda, joriy UiState bilan MutableStateFlow (yoki boshqa kuzatiladigan tur) yangilanishi mumkin.
  • Fragment yoki Activityda, UiState o'zgarishlariga obuna bo'lish va when yordamida har bir mumkin bo'lgan holatni boshqarish, UI ni mos ravishda yangilash.
// ViewModelda
class MyViewModel : ViewModel() {
    private val _uiState = MutableStateFlow<UiState>(UiState.Idle)
    val uiState: StateFlow<UiState> = _uiState.asStateFlow()

    fun loadData() {
        viewModelScope.launch {
            _uiState.value = UiState.Loading
            try {
                val result = fetchData() // Ma'lumotlarni olish funksiyangiz
                _uiState.value = UiState.Success(result)
            } catch (e: Exception) {
                _uiState.value = UiState.Error(e.message ?: "Noma'lum xato")
            }
        }
    }
}
// Compose yordamida Fragment/Activityda
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
    val uiState by viewModel.uiState.collectAsState()

    when (uiState) {
        UiState.Idle -> { /* Boshlang'ich ekranni ko'rsatish */ }
        UiState.Loading -> { /* Yuklanish indikatorini ko'rsatish */ }
        is UiState.Success -> {
            val data = (uiState as UiState.Success).data
            // Ma'lumotlarni ko'rsatish
        }
        is UiState.Error -> {
            val errorMessage = (uiState as UiState.Error).message
            // Xato xabarini ko'rsatish
        }
    }
}

Afzalliklari:

  • To'liq tekshirish: Kompilyator when da barcha qism subklasslarini boshqarishni talab qiladi. Bu holatlarni o'tkazib yuborishni oldini oladi va kodning ishonchliligini oshiradi.
  • Holatlarni aniq modellashtirish: UI komponentining barcha mumkin bo'lgan holatlarini aniq belgilaydi.
  • Tip xavfsizligi: Har bir holat o'z ma'lumotlariga ega, ularga xavfsiz kirish mumkin, hech qanday rildashsiz.
  • O'qilishi yaxshilanadi: Holatlar uchun sinflardan foydalanadigan kod tushunarli va oson qo'llab-quvvatlanadi.

Bu yondashuv Flow va Compose bilan ayniqsa foydalidir, lekin LiveData va View Binding bilan ham yaxshi ishlaydi.