Middle
Wie kann man mit sealed Klassen verschiedene Zustände in einer Android-Anwendung implementieren?
sobes.tech KI
Antwort von AI
Versiegelte Klassen eignen sich perfekt zur Modellierung einer endlichen Menge von Zuständen. Jeder Unterzustand kann seine eigenen einzigartigen Daten enthalten.
Beispiel:
sealed class UiState {
object Loading : UiState() // Ladezustand ohne Daten
data class Success(val data: List<Item>) : UiState() // Erfolgreicher Zustand mit empfangenen Daten
data class Error(val message: String) : UiState() // Fehlerzustand mit Nachricht
object Idle : UiState() // Anfangs- oder Neutralzustand
}
Anwendung:
- In
ViewModelkann manMutableStateFlow(oder einen anderen beobachtbaren Typ) mit dem aktuellenUiStateaktualisieren. - In
FragmentoderActivitykann man sich auf Änderungen desUiStateabonnieren und mitwhenjeden möglichen Zustand behandeln, um die UI entsprechend zu aktualisieren.
// Im 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() // Ihre Funktion zum Datenabruf
_uiState.value = UiState.Success(result)
} catch (e: Exception) {
_uiState.value = UiState.Error(e.message ?: "Unbekannter Fehler")
}
}
}
}
// In Fragment/Activity (mit Compose)
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
val uiState by viewModel.uiState.collectAsState()
when (uiState) {
UiState.Idle -> { /* Anfangsbildschirm anzeigen */ }
UiState.Loading -> { /* Ladeindikator anzeigen */ }
is UiState.Success -> {
val data = (uiState as UiState.Success).data
// Daten anzeigen
}
is UiState.Error -> {
val errorMessage = (uiState as UiState.Error).message
// Fehlermeldung anzeigen
}
}
}
Vorteile:
- Umfassende Überprüfung: Der Compiler verlangt, alle Unterklassen der versiegelten Klasse im
when-Ausdruck zu behandeln. Dies verhindert das Übersehen von Zuständen und erhöht die Zuverlässigkeit des Codes. - Klare Zustandsmodellierung: Definiert explizit alle möglichen Zustände der UI-Komponente.
- Typsicherheit: Jeder Zustand hat eigene Daten, auf die sicher zugegriffen werden kann, ohne Casts.
- Verbesserte Lesbarkeit: Code, der versiegelte Klassen für Zustände verwendet, ist verständlicher und wartungsfreundlicher.
Dieser Ansatz ist besonders nützlich mit Flow und Compose, funktioniert aber auch gut mit LiveData und View Binding.