Товар добавляется в корзину, но список на экране не меняется
Состояние экрана корзины:
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 оформлена не в том методе жизненного цикла — достаточно переподписаться при возврате на экран, и накопленные обновления придут разом
