Кнопка «наверх» вызывает перерисовку всего экрана при прокрутке
Кнопка возврата наверх показывается после небольшой прокрутки:
@Composable
fun FeedScreen(items: List<Post>) {
val listState = rememberLazyListState()
val showButton = listState.firstVisibleItemIndex > 5
Box {
LazyColumn(state = listState) { /* ... */ }
if (showButton) ScrollToTopButton()
}
}
Профилировщик показывает, что во время прокрутки функция экрана перерисовывается непрерывно. Почему и что делать?
- Нужно перенести состояние прокрутки во ViewModel: тогда его изменения перестанут задевать разметку экрана и перерисовок станет меньше
- Состояние прокрутки прочитано в теле экрана — флаг нужно вычислять в производном состоянии или читать отложенно внутри кнопки
- Чтение состояния прокрутки в Compose стоит дёшево, тормозит сама лента — стоит уменьшить сложность карточек
- Проблема решается добавлением стабильных ключей элементам ленты: без них список перерисовывается целиком на каждый кадр
