Sobes.tech
Middle

Kā ar sealed klasēm var īstenot dažādus stāvokļus Android lietotnē?

sobes.tech AI

Atbilde no AI

Aizvērtās klases ir ideālas, lai modelētu galīgo stāvokļu kopumu. Katrs apakšklaiss var saturēt savus unikālos datus.

Piemērs:

sealed class UiState {
    object Loading : UiState() // Stāvoklis bez datiem
    data class Success(val data: List<Item>) : UiState() // Veiksmīgs stāvoklis ar saņemtajiem datiem
    data class Error(val message: String) : UiState() // Kļūdas stāvoklis ar ziņojumu

    object Idle : UiState() // Sākuma vai neitrāls stāvoklis
}

Lietošana:

  • ViewModel var atjaunināt MutableStateFlow (vai citu novērojamu tipu) ar pašreizējo UiState.
  • Fragmentā vai Activity var abonēt UiState izmaiņas un ar when apstrādāt katru iespējamā stāvokļa, atjauninot UI atbilstoši.
// `ViewModel` iekšpusē
class MyViewModel : ViewModel() {
    private val _uiState = MutableStateFlow<UiState>(UiState.Idle)
    val uiState: StateFlow<UiState> = _uiState.asStateFlow()

    fun loadData() {
        viewModelScope.launch {
            _uiState.value = UiState.Loading
            mēģināt {
                val result = fetchData() // Jūsu funkcija datu iegūšanai
                _uiState.value = UiState.Success(result)
            } ķert (e: Exception) {
                _uiState.value = UiState.Error(e.message ?: "Nezināma kļūda")
            }
        }
    }
}
// Fragmentā vai `Activity` (izmantojot Compose)
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
    val uiState by viewModel.uiState.collectAsState()

    when (uiState) {
        UiState.Idle -> { /* Rādīt sākuma ekrānu */ }
        UiState.Loading -> { /* Rādīt ielādes indikatoru */ }
        is UiState.Success -> {
            val data = (uiState as UiState.Success).data
            // Rādīt datus
        }
        is UiState.Error -> {
            val errorMessage = (uiState as UiState.Error).message
            // Rādīt kļūdas ziņojumu
        }
    }
}

Priekšrocības:

  • Pilnīga kontrole: when pieprasa apstrādāt visas aizvērtās klases apakškopas, kas novērš stāvokļu izlaidi un uzlabo koda uzticamību.
  • Skaidrs stāvokļu modelis: Skaidri definē visas iespējamās UI stāvokļus.
  • Tipu drošība: Katram stāvoklim ir savi dati, piekļuve tiem ir droša, bez nepieciešamības pārveidot.
  • Labāka lasāmība: Kods, kas izmanto aizvērtās klases stāvokļiem, kļūst saprotamāks un vieglāk uzturams.

Šī pieeja ir īpaši noderīga ar Flow un Compose, bet labi darbojas arī ar LiveData un View Binding.