Middle
Cum se pot implementa diferite stări într-o aplicație Android folosind clase sealed?
sobes.tech AI
Răspuns de la AI
Clasele sealed sunt ideale pentru modelarea unui set finit de stări. Fiecare stare secundară poate conține propriile date unice.
Exemplu:
sealed class UiState {
object Loading : UiState() // Stare de încărcare fără date
data class Success(val data: List<Item>) : UiState() // Stare de succes cu date primite
data class Error(val message: String) : UiState() // Stare de eroare cu mesaj
object Idle : UiState() // Stare inițială sau neutră
}
Aplicare:
- În
ViewModel, se poate actualizaMutableStateFlow(sau alt tip observabil) cuUiStatecurent. - În
FragmentsauActivity, abonați-vă la modificărileUiStateși folosițiwhenpentru a trata fiecare stare posibilă, actualizând UI-ul corespunzător.
// În 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() // Funcția ta de preluare a datelor
_uiState.value = UiState.Success(result)
} catch (e: Exception) {
_uiState.value = UiState.Error(e.message ?: "Eroare necunoscută")
}
}
}
}
// În Fragment/Activity (folosind Compose)
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
val uiState by viewModel.uiState.collectAsState()
when (uiState) {
UiState.Idle -> { /* Afișează ecranul inițial */ }
UiState.Loading -> { /* Afișează indicatorul de încărcare */ }
is UiState.Success -> {
val data = (uiState as UiState.Success).data
// Afișează datele
}
is UiState.Error -> {
val errorMessage = (uiState as UiState.Error).message
// Afișează mesajul de eroare
}
}
}
Avantaje:
- Verificare exhaustivă: Compilatorul necesită tratarea tuturor subclasei clasei sealed în
when. Acest lucru previne omisiunile și crește fiabilitatea codului. - Modelare clară a stărilor: Definește explicit toate stările posibile ale componentei UI.
- Siguranță de tip: Fiecare stare are propriile date, accesibile în siguranță, fără necesitatea de casting.
- Citire mai ușoară: Codul care folosește clase sealed pentru stări devine mai clar și mai ușor de întreținut.
Această abordare este deosebit de utilă cu Flow și Compose, dar funcționează bine și cu LiveData și View Binding.