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
ViewModelmôžete aktualizovaťMutableStateFlow(alebo iný sledovateľný typ) s aktuálnymUiState. - V
FragmentaleboActivitysa prihlásiť na zmenyUiStatea pomocouwhenspracovať 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.