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
ViewModelkan jeMutableStateFlowbijwerken (of een ander observeerbaar type) met de huidigeUiState. - In
FragmentofActivity, je kunt je abonneren op veranderingen inUiStateen metwhenelk 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.