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ичинде бардык подклассыларды иштетүүнү талап кылат, бул абалдардын пропуск кылынуусун алдын алат жана коддун ишенимдүүлүгүн жогорулатат. - Ачык моделдөө: Бардык мүмкүн болгон UI абалдарын так аныктайт.
- Типтик коопсуздук: Ар бир абал өзүнүн маалыматтарына ээ, жана аларга жетүү коопсуз, түрлөрдү өзгөртүүнүн кереги жок.
- Окуулушун жакшыртуу: Абалдар үчүн жабык класстарды колдонгон код түшүнүктүү жана оңой колдоого алынат.
Бул ыкма Flow жана Compose менен иштөөдө өзгөчө пайдалуу, бирок LiveData жана View Binding менен да жакшы иштейт.