Выбор ответа Middle Жизненный цикл обновлено
Flutter: зачем didUpdateWidget
Вопрос
Экран Profile(userId: ...) грузит данные в initState. Родитель передал новый userId, а экран показывает старого пользователя. Где ошибка?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Не обработан didUpdateWidget: State прежний, а initState второй раз не вызывается. При новом виджете того же типа и ключа элемент и State переиспользуются, и вызывается didUpdateWidget(oldWidget). initState вызывается один раз за жизнь State.
Варианты ответа
- Нужно вызвать
initStateвручную изbuild, когда параметры виджета поменялись - Родитель должен вызывать
setStateу дочернего экрана, чтобы тот перезагрузился - Нужно перенести загрузку в
dispose, тогда старые данные очистятся перед новыми - Не обработан
didUpdateWidget:Stateпрежний, аinitStateвторой раз не вызываетсяправильный ответ
Разбор
При новом виджете того же типа и ключа элемент и State переиспользуются, и вызывается didUpdateWidget(oldWidget). initState вызывается один раз за жизнь State. Правильно: if (oldWidget.userId != widget.userId) _load();. Ещё вариант: дать экрану key: ValueKey(userId), тогда смена id пересоздаст State. Вызывать initState руками нельзя.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.