Выбор ответа 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 тот же экземпляр.
Варианты ответа
emitнельзя вызывать из обычных методовCubit, только из обработчиков событийemitполучил тот же объект, аBlocне выпускает состояние, равное текущемуправильный ответ- После
emitнужно дополнительно вызватьnotifyListeners(), иначе UI не узнает - Список в состоянии должен быть
const, иначеCubitне отслеживает его изменения
Разбор
Состояние мутировали на месте и передали в emit тот же экземпляр. Он равен текущему (== по ссылке, и даже с equatable поля совпадают, ведь это один список), поэтому Bloc его пропускает. Правильно создавать новое состояние: emit(CartState([...state.items, item])). notifyListeners относится к ChangeNotifier, а const-список нельзя изменить вообще.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
BLoC: BlocBuilder и BlocListener
Следующий вопрос
Flutter: локальное или общее состояние