Вступить в клуб →
средняявопросАрхитектура и состояние экрана

Товар добавляется в корзину, но список на экране не меняется

Состояние экрана корзины:

data class CartState(val items: List<CartItem>)

class CartViewModel : ViewModel() {
    private val items = mutableListOf<CartItem>()
    private val _state = MutableStateFlow(CartState(items))
    val state: StateFlow<CartState> = _state

    fun add(item: CartItem) {
        items.add(item)
        _state.value = CartState(items)
    }
}

По логам видно, что add вызывается и размер списка растёт. Экран при этом не перерисовывается.

Почему?

  • В состояние кладётся ссылка на один и тот же изменяемый список, поэтому новый CartState равен предыдущему по equals и StateFlow не публикует повтор
  • MutableStateFlow не работает с коллекциями, для списков нужен SharedFlow
  • Значение присваивается не в главном потоке, поэтому обновление теряется
  • Подписка на state оформлена не в том методе жизненного цикла — достаточно переподписаться при возврате на экран, и накопленные обновления придут разом

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела