Выбор ответа Middle Жизненный цикл обновлено

Flutter: зачем didUpdateWidget

Вопрос

Экран Profile(userId: ...) грузит данные в initState. Родитель передал новый userId, а экран показывает старого пользователя. Где ошибка?

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

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

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

Коротко

Правильный ответ: Не обработан didUpdateWidget: State прежний, а initState второй раз не вызывается. При новом виджете того же типа и ключа элемент и State переиспользуются, и вызывается didUpdateWidget(oldWidget). initState вызывается один раз за жизнь State.

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

  1. Нужно вызвать initState вручную из build, когда параметры виджета поменялись
  2. Родитель должен вызывать setState у дочернего экрана, чтобы тот перезагрузился
  3. Нужно перенести загрузку в dispose, тогда старые данные очистятся перед новыми
  4. Не обработан didUpdateWidget: State прежний, а initState второй раз не вызываетсяправильный ответ

Разбор

При новом виджете того же типа и ключа элемент и State переиспользуются, и вызывается didUpdateWidget(oldWidget). initState вызывается один раз за жизнь State. Правильно: if (oldWidget.userId != widget.userId) _load();. Ещё вариант: дать экрану key: ValueKey(userId), тогда смена id пересоздаст State. Вызывать initState руками нельзя.

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

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