Sobes.tech
Middle

Kaip naudojant sealed klases įgyvendinti skirtingas būsenas Android programėlėje?

sobes.tech AI

Atsakymas iš AI

Uždarie klasės yra puikios modeliuojant galutinį būsenų rinkinį. Kiekviena pogrupio būsena gali turėti savo unikalius duomenis.

Pavyzdys:

sealed class UiState {
    object Loading : UiState() // Būsena be duomenų įkėlimo
    data class Success(val data: List<Item>) : UiState() // Sėkminga būsena su gautais duomenimis
    data class Error(val message: String) : UiState() // Klaidos būsena su pranešimu

    object Idle : UiState() // Pradinė arba neutrali būsena
}

Naudojimas:

  • ViewModel galima atnaujinti MutableStateFlow (ar kitokiu stebimu tipu) su dabartine UiState.
  • Fragment'e arba Activity galima prenumeruoti UiState pokyčius ir naudoti when apdoroti kiekvieną galimą būseną, atitinkamai atnaujinant UI.
// `ViewModel` viduje
class MyViewModel : ViewModel() {
    private val _uiState = MutableStateFlow<UiState>(UiState.Idle)
    val uiState: StateFlow<UiState> = _uiState.asStateFlow()

    fun loadData() {
        viewModelScope.launch {
            _uiState.value = UiState.Loading
            bandykite {
                val result = fetchData() // Jūsų duomenų gavimo funkcija
                _uiState.value = UiState.Success(result)
            } gaudyti (e: Exception) {
                _uiState.value = UiState.Error(e.message ?: "Nežinoma klaida")
            }
        }
    }
}
// Fragment'e arba `Activity` (naudojant Compose)
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
    val uiState by viewModel.uiState.collectAsState()

    when (uiState) {
        UiState.Idle -> { /* Rodyti pradinį ekraną */ }
        UiState.Loading -> { /* Rodyti įkėlimo indikatorius */ }
        is UiState.Success -> {
            val data = (uiState as UiState.Success).data
            // Rodyti duomenis
        }
        is UiState.Error -> {
            val errorMessage = (uiState as UiState.Error).message
            // Rodyti klaidos pranešimą
        }
    }
}

Privalumai:

  • Visapusiška kontrolė: when reikalauja apdoroti visas uždaros klasės pogrupius, kas užkerta kelią būsenų praleidimui ir padidina kodo patikimumą.
  • Aiškus būsenų modeliavimas: Aiškiai apibrėžia visas galimas UI būsenas.
  • Tipų saugumas: Kiekviena būsena turi savo duomenis, prie kurių prieiga yra saugi, be konvertavimo.
  • Geriau skaitomas kodas: Kodas, naudojantis uždaras klases būsenoms, tampa aiškesnis ir lengviau prižiūrimas.

Šis požiūris ypač naudingas naudojant Flow ir Compose, bet taip pat gerai veikia su LiveData ir View Binding.