Middle
Hogyan lehet különböző állapotokat megvalósítani Android alkalmazásban sealed osztályok segítségével?
sobes.tech MI
Válasz az MI-től
Zárt osztályok ideálisak a végső állapotok halmazának modellezésére. Minden alállapot tartalmazhat saját egyedi adatait.
Példa:
sealed class UiState {
object Loading : UiState() // Betöltési állapot adatok nélkül
data class Success(val data: List<Item>) : UiState() // Sikeres állapot kapott adatokkal
data class Error(val message: String) : UiState() // Hiba állapot üzenettel
object Idle : UiState() // Kezdeti vagy semleges állapot
}
Alkalmazás:
- A
ViewModel-ben frissítheti aMutableStateFlow-t (vagy más megfigyelhető típust) a jelenlegiUiState-tel. - A
Fragment-ben vagyActivity-ben feliratkozhat aUiStateváltozásaira, és awhensegítségével kezelheti az összes lehetséges állapotot, megfelelően frissítve a UI-t.
// A ViewModel-ben
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() // Az adatok lekérdezésének funkciója
_uiState.value = UiState.Success(result)
} catch (e: Exception) {
_uiState.value = UiState.Error(e.message ?: "Ismeretlen hiba")
}
}
}
}
// A Compose-t használó Fragment/Activity
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
val uiState by viewModel.uiState.collectAsState()
when (uiState) {
UiState.Idle -> { /* Kezdőképernyő megjelenítése */ }
UiState.Loading -> { /* Betöltési indikátor megjelenítése */ }
is UiState.Success -> {
val data = (uiState as UiState.Success).data
// Adatok megjelenítése
}
is UiState.Error -> {
val errorMessage = (uiState as UiState.Error).message
// Hibaüzenet megjelenítése
}
}
}
Előnyök:
- Kimerítő ellenőrzés: A fordító megköveteli, hogy minden alosztályt kezeljen a
when-ben. Ez megakadályozza a hiányzó állapotokat, és növeli a kód megbízhatóságát. - Világos állapotmodell: Egyértelműen meghatározza az összes lehetséges UI állapotot.
- Típusbiztonság: Minden állapot saját adatokkal rendelkezik, amelyek biztonságosan elérhetők, cast nélkül.
- Jobb olvashatóság: A sealed osztályokat használó kód könnyebben érthető és karbantartható.
Ez a megközelítés különösen hasznos Flow és Compose esetén, de jól működik LiveData és View Binding mellett is.