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, joriyUiStatebilanMutableStateFlow(yoki boshqa kuzatiladigan tur) yangilanishi mumkin.FragmentyokiActivityda,UiStateo'zgarishlariga obuna bo'lish vawhenyordamida 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
whenda 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.