Я читаю ускоренный курс по уровню пользовательского интерфейса Android, и там предлагается моделировать сложное состояние пользовательского интерфейса с помощью запечатанного класса, например. вот так:

Я бы представил такое состояние пользовательскому интерфейсу (Compose) в виде
private val _uiState = MutableStateFlow(HomeUiState.NoPosts()) // поток типа HomeUiState вал uiState = _uiState.asStateFlow() Теперь, если я активирую бизнес-логику из своего пользовательского интерфейса, например
// в пользовательском интерфейсе когда (uiState) { is HasPosts -> { // умное приведение типа интерфейса к конкретному классу данных HomeUiState.HasPosts // Действие инициировано, например. с помощью кнопки viewModel.refreshPosts() } } Похоже, мне всегда приходится выполнять приведение типов в ViewModel, прежде чем я смогу получить доступ к членам, специфичным для UiState, из которого была запущена функция.
// ViewModel весело обновитьPosts() { if(uiState.value — HomeUiState.HasPosts) { // здесь я могу получить доступ к конкретным членам HasPosts, таким как PostsFeed uiState.postsFeed.refresh() } } Я не могу представить, чтобы мне приходилось выполнять приведение типа в каждой функции ViewModel, чтобы получить доступ к свойствам UiState. Например. подумайте о UiStates, таких как UiState.Loading и UiState.Success: большинство функций в ViewModel будут работать с состоянием UiState.Success и просто потому что у меня есть еще один UiState, который мне нужно использовать везде?
Я точно что-то упускаю?!
Мобильная версия