Выбор ответа Senior Управление состоянием обновлено

BLoC: почему не перестраивается UI

Вопрос

Почему после addItem экран не обновляется?

class CartCubit extends Cubit<CartState> {
  CartCubit() : super(CartState([]));

  void addItem(Item item) {
    state.items.add(item);
    emit(state);
  }
}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: emit получил тот же объект, а Bloc не выпускает состояние, равное текущему. Состояние мутировали на месте и передали в emit тот же экземпляр.

Варианты ответа

  1. emit нельзя вызывать из обычных методов Cubit, только из обработчиков событий
  2. emit получил тот же объект, а Bloc не выпускает состояние, равное текущемуправильный ответ
  3. После emit нужно дополнительно вызвать notifyListeners(), иначе UI не узнает
  4. Список в состоянии должен быть const, иначе Cubit не отслеживает его изменения

Разбор

Состояние мутировали на месте и передали в emit тот же экземпляр. Он равен текущему (== по ссылке, и даже с equatable поля совпадают, ведь это один список), поэтому Bloc его пропускает. Правильно создавать новое состояние: emit(CartState([...state.items, item])). notifyListeners относится к ChangeNotifier, а const-список нельзя изменить вообще.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме