Sobes.tech
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 actualiza MutableStateFlow (sau alt tip observabil) cu UiState curent.
  • În Fragment sau Activity, abonați-vă la modificările UiState și folosiți when pentru 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.