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:
ViewModelgalima atnaujintiMutableStateFlow(ar kitokiu stebimu tipu) su dabartineUiState.- Fragment'e arba
Activitygalima prenumeruotiUiStatepokyčius ir naudotiwhenapdoroti 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ė:
whenreikalauja 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.