Sobes.tech
Middle

Ako pomocou sealed tried implementovať rôzne stavy v Android aplikácii?

sobes.tech AI

Odpoveď od AI

Zatvorené triedy sú ideálne na modelovanie konečného súboru stavov. Každý podtried môže obsahovať svoje jedinečné údaje.

Príklad:

sealed class UiState {
    object Loading : UiState() // Stav načítania bez údajov
    data class Success(val data: List<Item>) : UiState() // Úspešný stav s načítanými údajmi
    data class Error(val message: String) : UiState() // Stav chyby s hlásením

    object Idle : UiState() // Počiatočný alebo neutrálny stav
}

Použitie:

  • V ViewModel môžete aktualizovať MutableStateFlow (alebo iný sledovateľný typ) s aktuálnym UiState.
  • V Fragment alebo Activity sa prihlásiť na zmeny UiState a pomocou when spracovať každý možný stav, primerane aktualizujúc 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ša funkcia na získanie údajov
                _uiState.value = UiState.Success(result)
            } catch (e: Exception) {
                _uiState.value = UiState.Error(e.message ?: "Neznáma chyba")
            }
        }
    }
}
// V Fragment/Activity (používajúc Compose)
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
    val uiState by viewModel.uiState.collectAsState()

    when (uiState) {
        UiState.Idle -> { /* Zobraziť úvodnú obrazovku */ }
        UiState.Loading -> { /* Zobraziť indikátor načítania */ }
        is UiState.Success -> {
            val data = (uiState as UiState.Success).data
            // Zobraziť údaje
        }
        is UiState.Error -> {
            val errorMessage = (uiState as UiState.Error).message
            // Zobraziť chybové hlásenie
        }
    }
}

Výhody:

  • Kompletná kontrola: Kompilátor vyžaduje spracovanie všetkých podtried zatvoreného triedy v výraze when. To zabraňuje vynechaniu stavov a zvyšuje spoľahlivosť kódu.
  • Jasné modelovanie stavov: Výslovne definuje všetky možné stavy UI komponentu.
  • Typová bezpečnosť: Každý stav má svoje vlastné údaje, ku ktorým je prístup bezpečný, bez potreby pretypovania.
  • Zlepšená čitateľnosť: Kód používajúci zatvorené triedy na stavy sa stáva zrozumiteľnejším a ľahko udržiavateľným.

Tento prístup je obzvlášť užitočný s Flow a Compose, ale dobre funguje aj s LiveData a View Binding.