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

FlatList: дубли страниц при onEndReached

Вопрос

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

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

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

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

Коротко

Правильный ответ: onEndReached срабатывает повторно до конца загрузки; нужен флаг и проверка конца. При прокрутке и изменении содержимого событие конца списка может прийти повторно, пока данные ещё грузятся.

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

  1. onEndReachedThreshold нельзя задавать меньше 1, иначе событие дублируется
  2. FlatList всегда вызывает onEndReached дважды, это поведение по спецификации
  3. Сервер должен сам отбрасывать повторные запросы, клиент тут ни при чём
  4. onEndReached срабатывает повторно до конца загрузки; нужен флаг и проверка концаправильный ответ

Разбор

При прокрутке и изменении содержимого событие конца списка может прийти повторно, пока данные ещё грузятся. Защита: не запускать загрузку, если она уже идёт или страниц больше нет, и склеивать страницы с удалением дублей по id. TanStack Query (useInfiniteQuery с isFetchingNextPage) делает это за вас. Порог может быть дробным (0.5 это половина экрана), а «вызов дважды по спецификации» не существует.

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

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

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