Sobes.tech
Middle

Hoe kun je verschillende toestanden implementeren in een Android-app met behulp van sealed klassen?

sobes.tech AI

Antwoord van AI

Gesealdeerde klassen zijn ideaal voor het modelleren van een eindige set staten. Elke subclass-toestand kan zijn eigen unieke gegevens bevatten.

Voorbeeld:

sealed class UiState {
    object Loading : UiState() // Laadstatus zonder gegevens
    data class Success(val data: List<Item>) : UiState() // Successtatus met ontvangen gegevens
    data class Error(val message: String) : UiState() // Foutstatus met bericht

    object Idle : UiState() // Initiële of neutrale status
}

Toepassing:

  • In ViewModel kan je MutableStateFlow bijwerken (of een ander observeerbaar type) met de huidige UiState.
  • In Fragment of Activity, je kunt je abonneren op veranderingen in UiState en met when elk mogelijk status afhandelen, de UI dienovereenkomstig bijwerken.
// In 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() // Jouw functie om data op te halen
                _uiState.value = UiState.Success(result)
            } catch (e: Exception) {
                _uiState.value = UiState.Error(e.message ?: "Onbekende fout")
            }
        }
    }
}
// In Fragment/Activity (met Compose)
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
    val uiState by viewModel.uiState.collectAsState()

    when (uiState) {
        UiState.Idle -> { /* Toon het startscherm */ }
        UiState.Loading -> { /* Toon laadindicator */ }
        is UiState.Success -> {
            val data = (uiState as UiState.Success).data
            // Toon data
        }
        is UiState.Error -> {
            val errorMessage = (uiState as UiState.Error).message
            // Toon foutmelding
        }
    }
}

Voordelen:

  • Uitgebreide controle: De compiler vereist dat alle subclasses van de sealed class worden afgehandeld in de when. Dit voorkomt dat staten worden overgeslagen en verhoogt de betrouwbaarheid van de code.
  • Duidelijke modellering van staten: Definieert expliciet alle mogelijke staten van de UI-component.
  • Typeveiligheid: Elke staat heeft zijn eigen gegevens, die veilig toegankelijk zijn zonder casten.
  • Betere leesbaarheid: Code die sealed classes gebruikt voor staten wordt duidelijker en onderhoudsvriendelijker.

Deze aanpak is vooral handig met Flow en Compose, maar werkt ook goed met LiveData en View Binding.