Middle
Kā ar sealed klasēm var īstenot dažādus stāvokļus Android lietotnē?
sobes.tech AI
Atbilde no AI
Aizvērtās klases ir ideālas, lai modelētu galīgo stāvokļu kopumu. Katrs apakšklaiss var saturēt savus unikālos datus.
Piemērs:
sealed class UiState {
object Loading : UiState() // Stāvoklis bez datiem
data class Success(val data: List<Item>) : UiState() // Veiksmīgs stāvoklis ar saņemtajiem datiem
data class Error(val message: String) : UiState() // Kļūdas stāvoklis ar ziņojumu
object Idle : UiState() // Sākuma vai neitrāls stāvoklis
}
Lietošana:
ViewModelvar atjauninātMutableStateFlow(vai citu novērojamu tipu) ar pašreizējoUiState.- Fragmentā vai
Activityvar abonētUiStateizmaiņas un arwhenapstrādāt katru iespējamā stāvokļa, atjauninot UI atbilstoši.
// `ViewModel` iekšpusē
class MyViewModel : ViewModel() {
private val _uiState = MutableStateFlow<UiState>(UiState.Idle)
val uiState: StateFlow<UiState> = _uiState.asStateFlow()
fun loadData() {
viewModelScope.launch {
_uiState.value = UiState.Loading
mēģināt {
val result = fetchData() // Jūsu funkcija datu iegūšanai
_uiState.value = UiState.Success(result)
} ķert (e: Exception) {
_uiState.value = UiState.Error(e.message ?: "Nezināma kļūda")
}
}
}
}
// Fragmentā vai `Activity` (izmantojot Compose)
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
val uiState by viewModel.uiState.collectAsState()
when (uiState) {
UiState.Idle -> { /* Rādīt sākuma ekrānu */ }
UiState.Loading -> { /* Rādīt ielādes indikatoru */ }
is UiState.Success -> {
val data = (uiState as UiState.Success).data
// Rādīt datus
}
is UiState.Error -> {
val errorMessage = (uiState as UiState.Error).message
// Rādīt kļūdas ziņojumu
}
}
}
Priekšrocības:
- Pilnīga kontrole:
whenpieprasa apstrādāt visas aizvērtās klases apakškopas, kas novērš stāvokļu izlaidi un uzlabo koda uzticamību. - Skaidrs stāvokļu modelis: Skaidri definē visas iespējamās UI stāvokļus.
- Tipu drošība: Katram stāvoklim ir savi dati, piekļuve tiem ir droša, bez nepieciešamības pārveidot.
- Labāka lasāmība: Kods, kas izmanto aizvērtās klases stāvokļiem, kļūst saprotamāks un vieglāk uzturams.
Šī pieeja ir īpaši noderīga ar Flow un Compose, bet labi darbojas arī ar LiveData un View Binding.