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
ViewModellze aktualizovatMutableStateFlow(nebo jiný sledovatelný typ) s aktuálnímUiState. - V
FragmentneboActivityse přihlásit ke změnámUiStatea pomocíwhenzpracovat 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.