Middle
Kako implementirati različita stanja u Android aplikaciji koristeći sealed klase?
sobes.tech АИ
Одговор од АИ
Затворене класе су идеалне за моделирање крајњег скупа стања. Сваки подкласа може садржати своје јединствене податке.
Пример:
sealed class UiState {
object Loading : UiState() // Стање учитавања без података
data class Success(val data: List<Item>) : UiState() // Успешно стање са преузетим подацима
data class Error(val message: String) : UiState() // Стање грешке са поруком
object Idle : UiState() // Почетно или неутрално стање
}
Примена:
- У
ViewModelможете ажуриратиMutableStateFlow(или други пратиљиви тип) са тренутнимUiState. - У
FragmentилиActivityсе претплатити на променеUiStateи помоћуwhenобрадити сваки могући статус, одговарајуће ажурирајући UI.
// У ViewModel
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() // Ваша функција за добијање података
_uiState.value = UiState.Success(result)
} catch (e: Exception) {
_uiState.value = UiState.Error(e.message ?: "Непозната грешка")
}
}
}
}
// У Fragment/Activity (користећи Compose)
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
val uiState by viewModel.uiState.collectAsState()
when (uiState) {
UiState.Idle -> { /* Приказати почетни екран */ }
UiState.Loading -> { /* Приказати индикатор учитавања */ }
is UiState.Success -> {
val data = (uiState as UiState.Success).data
// Приказати податке
}
is UiState.Error -> {
val errorMessage = (uiState as UiState.Error).message
// Приказати поруку о грешци
}
}
}
Предности:
- Целовита провера: Компилатор захтева обраду свих подкласова sealed класе у изразу
when. Ово спречава пропуштање стања и повећава поузданост кода. - Јасно моделирање стања: Јасно дефинише сва могућа стања UI компонента.
- Безбедност типа: Свако стање има своје податке, до којих је приступ безбедан, без потребе за претварањем.
- Побољшана читљивост: Код који користи sealed класе за стања постаје разумљивији и лакши за одржавање.
Овај приступ је посебно користан са Flow и Compose, али добро функционише и са LiveData и View Binding.