Sobes.tech
Middle

Kuidas saab sealed klasside abil Android rakenduses erinevaid olekuid rakendada?

sobes.tech AI

Vastus AI-lt

Suletud klassid on ideaalsed, et modelleerida lõppstaatusi kogumit. Iga alamklass võib sisaldada oma unikaalseid andmeid.

Näide:

sealed class UiState {
    object Loading : UiState() // Laadimisolek ilma andmeteta
    data class Success(val data: List<Item>) : UiState() // Edukas olek saadud andmetega
    data class Error(val message: String) : UiState() // Viga sõnumiga

    object Idle : UiState() // Alg- või neutraalne olek
}

Kasutamine:

  • ViewModel-is saab uuendada MutableStateFlow (või teist jälgitavat tüüpi) praeguse UiState-ga.
  • Fragmentis või Activity-s saab tellida UiState muutusi ja when-i abil töödelda iga võimalikku olekut, vastavalt UI uuendades.
// `ViewModel`-is
class MyViewModel : ViewModel() {
    private val _uiState = MutableStateFlow<UiState>(UiState.Idle)
    val uiState: StateFlow<UiState> = _uiState.asStateFlow()

    fun loadData() {
        viewModelScope.launch {
            _uiState.value = UiState.Loading
            proovige {
                val result = fetchData() // Teie andmete saamise funktsioon
                _uiState.value = UiState.Success(result)
            } kinni (e: Exception) {
                _uiState.value = UiState.Error(e.message ?: "Tundmatu viga")
            }
        }
    }
}
// Fragmentis või `Activity`-s (kasutades Compose)
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
    val uiState by viewModel.uiState.collectAsState()

    when (uiState) {
        UiState.Idle -> { /* Näidata algsüsteemi ekraani */ }
        UiState.Loading -> { /* Näidata laadimisindikaator */ }
        is UiState.Success -> {
            val data = (uiState as UiState.Success).data
            // Näidata andmeid
        }
        is UiState.Error -> {
            val errorMessage = (uiState as UiState.Error).message
            // Näidata veateade
        }
    }
}

Eelised:

  • Täielik kontroll: when nõuab kõigi suletud klassi alamklasside töötlemist, mis takistab olekute vahelejäämist ja suurendab koodi usaldusväärsust.
  • Selge olekute modelleerimine: Selgelt määratleb kõik võimalikud UI olekud.
  • Tüüpide turvalisus: Igal olekul on oma andmed, millele pääseb ligi turvaliselt, ilma teisendamiseta.
  • Paranenud loetavus: Kood, mis kasutab suletud klasse olekute jaoks, muutub arusaadavamaks ja hooldatavamaks.

See lähenemine on eriti kasulik Flow ja Compose'iga, kuid töötab hästi ka LiveData ja View Binding'iga.