Sobes.tech
Middle

Jak lze pomocí sealed tříd implementovat různé stavy v Android aplikaci?

sobes.tech AI

Odpověď od AI

Sealed třídy jsou ideální pro modelování konečné sady stavů. Každý podtřída může obsahovat svá unikátní data.

Příklad:

sealed class UiState {
    object Loading : UiState() // Stav načítání bez dat
    data class Success(val data: List<Item>) : UiState() // Úspěšný stav s načtenými daty
    data class Error(val message: String) : UiState() // Stav chyby s hlášením

    object Idle : UiState() // Počáteční nebo neutrální stav
}

Použití:

  • V ViewModel lze aktualizovat MutableStateFlow (nebo jiný sledovatelný typ) s aktuálním UiState.
  • V Fragment nebo Activity se přihlásit ke změnám UiState a pomocí when zpracovat každý možný stav, odpovídajícím způsobem aktualizovat UI.
// V 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() // Vaše funkce pro získání dat
                _uiState.value = UiState.Success(result)
            } catch (e: Exception) {
                _uiState.value = UiState.Error(e.message ?: "Neznámá chyba")
            }
        }
    }
}
// V Fragmentu/Activity (používající Compose)
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
    val uiState by viewModel.uiState.collectAsState()

    when (uiState) {
        UiState.Idle -> { /* Zobrazit úvodní obrazovku */ }
        UiState.Loading -> { /* Zobrazit indikátor načítání */ }
        is UiState.Success -> {
            val data = (uiState as UiState.Success).data
            // Zobrazit data z data
        }
        is UiState.Error -> {
            val errorMessage = (uiState as UiState.Error).message
            // Zobrazit chybovou zprávu
        }
    }
}

Výhody:

  • Kompletní kontrola: Kompilátor vyžaduje zpracování všech podtříd sealed třídy v výrazu when. To zabraňuje vynechání stavů a zvyšuje spolehlivost kódu.
  • Jasné modelování stavů: Výslovně definuje všechny možné stavy UI komponenty.
  • Typová bezpečnost: Každý stav má svá vlastní data, ke kterým je přístup bezpečný, bez nutnosti přetypování.
  • Zlepšená čitelnost: Kód používající sealed třídy pro stavy je srozumitelnější a snadno udržovatelný.

Tento přístup je obzvláště užitečný s Flow a Compose, ale dobře funguje i s LiveData a View Binding.