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 uuendadaMutableStateFlow(või teist jälgitavat tüüpi) praeguseUiState-ga.- Fragmentis või
Activity-s saab tellidaUiStatemuutusi jawhen-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:
whennõ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.