Какие оптимизации есть в LazyColumn в Jetpack Compose
Что проверяют
Понимаете ли вы, что LazyColumn уже виртуализирует список, а скорость теряется из-за лишних рекомпозиций и неверных ключей. Следом просят рассказать, как вы нашли тормоза в реальном списке и чем их измеряли.
Как отвечать
Сначала что делает сам компонент: компонует только видимые элементы и немного за краем, заранее готовит следующий по ходу прокрутки (prefetch) и переиспользует композиции ушедших за экран элементов того же типа. Дальше то, что зависит от вас:
key:items(list, key = { it.id }). Без ключа позиция равна индексу, и вставка в начало перерисовывает весь видимый список и сбрасываетrememberв элементах. Ключ уникален и на Android должен сохраняться вBundle;contentType: для списков, где рядом заголовки, карточки и баннеры. Композиции переиспользуются только внутри одного типа;- стабильные параметры:
List<T>компилятор считает нестабильным. Помогают@Immutable,kotlinx.collections.immutableи режим strong skipping, включённый по умолчанию начиная с Kotlin 2.0.20; - состояние прокрутки: чтение
listState.firstVisibleItemIndexпрямо в композиции перезапускает её при каждом сдвиге. НуженderivedStateOf { listState.firstVisibleItemIndex > 0 }или чтение в лямбде модификатора; - тяжёлая работа: форматирование и сортировку делать во
ViewModel, а не в телеitem; - анимации:
Modifier.animateItem()вместо ручной анимации позиций.
Мерить только на release-сборке с R8 и baseline profile: debug-сборка Compose заметно медленнее, выводы по ней неверны. Лишние рекомпозиции видны в счётчиках Layout Inspector, джанк ловит Macrobenchmark.
Где спотыкаются
Берут сам элемент как ключ, key = { it }. Два одинаковых значения роняют приложение с IllegalArgumentException, а любое изменение данных меняет ключ.
Кладут LazyColumn в Column с verticalScroll. Бесконечная высота даёт IllegalStateException, а обход через фиксированную высоту убивает ленивость.
Думают, что элементам нужен фиксированный размер. Он не обязателен, важнее не делать элементы нулевой высоты: список решит, что видимых элементов очень много, и скомпонует их все сразу.