Ответ
Да, это современный подход для управления состоянием в ViewModel. Вместо использования множества LiveData/SateFlow или enum, мы создаем sealed interface/class, который инкапсулирует все возможные состояния экрана.
sealed interface LoginState {
object Loading : LoginState
data class Success(val user: User) : LoginState
data class Error(val message: String) : LoginState
}
class LoginViewModel : ViewModel() {
private val _state = MutableStateFlow<LoginState>(Loading)
val state: StateFlow<LoginState> = _state.asStateFlow()
fun login() {
viewModelScope.launch {
_state.value = Loading
try {
val user = repo.login()
_state.value = Success(user)
} catch (e: Exception) {
_state.value = Error(e.message ?: "Unknown error")
}
}
}
}
Преимущества:
- Четкое разделение состояний
- Исключены невалидные комбинации полей
- Удобно обрабатывать в UI через
when - Легко тестировать