Sobes.tech
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 ViewModel kann man MutableStateFlow (oder einen anderen beobachtbaren Typ) mit dem aktuellen UiState aktualisieren.
  • In Fragment oder Activity kann man sich auf Änderungen des UiState abonnieren und mit when jeden 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.