Sobes.tech
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 a MutableStateFlow-t (vagy más megfigyelhető típust) a jelenlegi UiState-tel.
  • A Fragment-ben vagy Activity-ben feliratkozhat a UiState változásaira, és a when segí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.