Вступить в клуб →
сложнаявопросJetpack Compose и состояние экрана

Кнопка «наверх» вызывает перерисовку всего экрана при прокрутке

Кнопка возврата наверх показывается после небольшой прокрутки:

@Composable
fun FeedScreen(items: List<Post>) {
    val listState = rememberLazyListState()
    val showButton = listState.firstVisibleItemIndex > 5

    Box {
        LazyColumn(state = listState) { /* ... */ }
        if (showButton) ScrollToTopButton()
    }
}

Профилировщик показывает, что во время прокрутки функция экрана перерисовывается непрерывно. Почему и что делать?

  • Нужно перенести состояние прокрутки во ViewModel: тогда его изменения перестанут задевать разметку экрана и перерисовок станет меньше
  • Состояние прокрутки прочитано в теле экрана — флаг нужно вычислять в производном состоянии или читать отложенно внутри кнопки
  • Чтение состояния прокрутки в Compose стоит дёшево, тормозит сама лента — стоит уменьшить сложность карточек
  • Проблема решается добавлением стабильных ключей элементам ленты: без них список перерисовывается целиком на каждый кадр

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела