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

Provider: select для точечной подписки

Вопрос

Виджет показывает только количество товаров в корзине, а корзина часто меняет другие поля. Как сократить перестроения?

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

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

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

Коротко

Правильный ответ: context.select<Cart, int((c) = c.count) вместо подписки на всю корзину. select сравнивает выбранное значение до и после уведомления и перестраивает виджет только если оно изменилось. read в build не подписывает вообще, и счётчик перестанет обновляться.

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

  1. context.read<Cart>().count прямо в build: тогда лишних подписок не будет
  2. Обернуть виджет в RepaintBoundary, чтобы он не перерисовывался вместе с корзиной
  3. Вызывать notifyListeners реже в остальных методах корзины, только при смене количества
  4. context.select<Cart, int>((c) => c.count) вместо подписки на всю корзинуправильный ответ

Разбор

select сравнивает выбранное значение до и после уведомления и перестраивает виджет только если оно изменилось. read в build не подписывает вообще, и счётчик перестанет обновляться. RepaintBoundary про отрисовку, а не про build. Реже уведомлять ради одного виджета значит ломать остальных подписчиков.

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

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

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