Sobes.tech
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.