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-ի հետ: