Выбор ответа Junior Производительность спрашивают часто обновлено

Flutter: FutureBuilder с future в build

Вопрос

Что не так с этим кодом?

@override
Widget build(BuildContext context) {
  return FutureBuilder(
    future: api.loadProfile(),
    builder: (context, snap) => snap.hasData
        ? Text(snap.data!.name)
        : const CircularProgressIndicator(),
  );
}

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

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

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

Коротко

Правильный ответ: Запрос уходит на каждом перестроении; Future создают в initState. build вызывается часто, и каждый раз создаётся новый Future: FutureBuilder видит другой объект, подписывается заново и показывает загрузку.

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

  1. Ничего: FutureBuilder сам кеширует результат по типу и повторно не запрашивает
  2. Запрос уходит на каждом перестроении; Future создают в initStateправильный ответ
  3. FutureBuilder нельзя использовать в StatelessWidget, только в StatefulWidget
  4. Нужно добавить await перед api.loadProfile(), иначе данные не придут

Разбор

build вызывается часто, и каждый раз создаётся новый Future: FutureBuilder видит другой объект, подписывается заново и показывает загрузку. Future создают один раз (в initState или в стейт-менеджере) и передают готовым. Кеширования по типу нет, StatelessWidget тут ни при чём, а await в build невозможен.

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

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