Sobes.tech
Middle

Ինչպես կարելի է տարբեր վիճակներ իրականացնել Android հավելվածում օգտագործելով sealed դասեր?

sobes.tech AI

Պատասխան AI-ից

Փակ դասերը իդեալական են վերջնական վիճակների հավաքածուի մոդելավորման համար: Յուրաքանչյուր ենթակլասը կարող է պարունակել իր յուրահատուկ տվյալները:

Օրինակ՝

sealed class UiState {
    object Loading : UiState() // Բեռնման վիճակ՝ առանց տվյալների
    data class Success(val data: List<Item>) : UiState() // Հաջողակ վիճակ՝ ստացված տվյալներով
    data class Error(val message: String) : UiState() // Հետախուզական վիճակ՝ հաղորդագրությամբ

    object Idle : UiState() // Սկզբնական կամ նեյտրալ վիճակ
}

Օգտագործում՝

  • ViewModel-ում կարելի է թարմացնել MutableStateFlow (կամ այլ տեսակի) ներկայիս UiState-ով:
  • Fragment կամ Activity-ում բաժանորդագրվել UiState-ի փոփոխություններին և when-ով մշակել յուրաքանչյուր հնարավոր վիճակ, համապատասխանաբար թարմացնելով UI-ն:
// ViewModel-ում
class MyViewModel : ViewModel() {
    private val _uiState = MutableStateFlow<UiState>(UiState.Idle)
    val uiState: StateFlow<UiState> = _uiState.asStateFlow()

    fun loadData() {
        viewModelScope.launch {
            _uiState.value = UiState.Loading
            փորձել {
                val result = fetchData() // Ձեր տվյալների ստացման ֆունկցիան
                _uiState.value = UiState.Success(result)
            } բռնվել (e: Exception) {
                _uiState.value = UiState.Error(e.message ?: "Անհայտ սխալ")
            }
        }
    }
}
// Fragment/Activity-ում (օգտագործելով Compose)
@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
    val uiState by viewModel.uiState.collectAsState()

    when (uiState) {
        UiState.Idle -> { /* Ցույց տալ սկզբնական էկրան */ }
        UiState.Loading -> { /* Ցույց տալ բեռնում ցուցիչ */ }
        is UiState.Success -> {
            val data = (uiState as UiState.Success).data
            // Ցույց տալ տվյալները
        }
        is UiState.Error -> {
            val errorMessage = (uiState as UiState.Error).message
            // Ցույց տալ սխալի հաղորդագրությունը
        }
    }
}

Առավելություններ՝

  • Ամբողջական վերահսկում: Կոմպիլյատորը պահանջում է, որ when-ում մշակվեն բոլոր ենթակլասները, ինչը կանխում է վիճակների բացթողումը և բարձրացնում է կոդի հուսալիությունը:
  • Հստակ մոդելավորում: Բացահայտում է բոլոր հնարավոր վիճակները:
  • Տիպային անվտանգություն: Ամեն մի վիճակ ունի իր տվյալները, և դրանց հասանելիությունը ապահով է, առանց փոխակերպման:
  • Կարդալության բարելավում: Կոդը, որը օգտագործում է փակ դասեր վիճակների համար, ավելի հստակ և հեշտ է պահպանել:

Այս մոտեցումը հատկապես օգտակար է Flow և Compose-ի հետ, բայց լավ աշխատում է նաև LiveData և View Binding-ի հետ: