Как правильно подойти к вопросу: действительно ли LazyColumn такой медленный?
По вводным: друзья, есть у меня список на 30 элементов.
По вводным: в каждом элементе - Card с 7ю TextView в ктотрые пишутся данные из объекта, без всяких сложных вычислений
По вводным: ну прям вообще ничего такого
По вводным: в RecyclerView просто красота - летает
По вводным: переделал на LazyColumn - лагает. И в дебаге и в релизе.
По вводным: добавил всяких оптимизаций - key, contentType - лагает
По вводным: проверил рекомпозицию (просто выводом println) - вычисления проводятся как нужно - один раз при появлении элемента
То есть вроде все работает как нужно
По вводным: поудалял все - оставил пару элементов Теxt в карточке
А все равно тормозит.
По вводным: появляются рывки при прохождении границ элементов (ну понятно - создает новые композиции)
По вводным: и телефон то вроде норм - Samsung S23+
Нужно понять: неужели compose такой медленный?
Поделитесь опытом.
Нужно понять: оптимизирует ли compose при создании релизного билда?
По вводным: вроде в релизном билде работает побыстрее все-же.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
LazyColumn сам по себе не должен лагать на 30 простых элементах. Если RecyclerView летает, а LazyColumn заметно дёргается даже с несколькими Text, значит проблема чаще не в количестве элементов, а в окружении Compose: debug-сборка, тяжёлые modifiers, измерение, вложенные scroll-контейнеры, шрифты, тени, Card/elevation, неправильное состояние или старые версии Compose/Compiler.
Сначала сравнивайте только release-сборку с включённым R8. Debug в Compose может быть очень обманчивым. Прогоните:
./gradlew assembleRelease./gradlew assembleRelease
Потом проверьте минимальный пример без Card, без custom font, без shadow, без animateContentSize и без вложенных Lazy/Column со scroll. Если минимальный LazyColumn плавный, возвращайте элементы по одному и смотрите, на чём появляется лаг.
Для списка используйте стабильные модели и ключи:
LazyColumn { items( items = rows, key = { it.id }, contentType = { "row" } ) { row -> RowItem(row) } }
Если объект строки пересоздаётся при каждом изменении экрана или не является стабильным, Compose может делать лишнюю работу. Полезно сделать модель immutable и не прокидывать в item лямбды, которые создаются заново без необходимости.
Также проверьте, нет ли у вас
Modifier.height(IntrinsicSize...), сложных shadow, blur, clip с большим радиусом, AsyncImage без фиксированного размера, анимаций или пересчёта форматирования текста прямо в composable. Даже 30 карточек могут лагать, если каждая дорогая в measure/draw.Итог: LazyColumn не должен быть медленным на таком списке. Проверяйте release, версии Compose, стабильность данных, тяжёлые modifiers и вложенные scroll. Если минимальный пример лагает даже в release на нормальном устройстве, тогда уже стоит смотреть profiler и конкретные версии Compose/AGP.