Как правильно подойти к вопросу: действительно ли LazyColumn такой медленный?

Ссылка скопирована
1 ответ

По вводным: друзья, есть у меня список на 30 элементов.
По вводным: в каждом элементе - Card с 7ю TextView в ктотрые пишутся данные из объекта, без всяких сложных вычислений
По вводным: ну прям вообще ничего такого
По вводным: в RecyclerView просто красота - летает

По вводным: переделал на LazyColumn - лагает. И в дебаге и в релизе.
По вводным: добавил всяких оптимизаций - key, contentType - лагает
По вводным: проверил рекомпозицию (просто выводом println) - вычисления проводятся как нужно - один раз при появлении элемента
То есть вроде все работает как нужно

По вводным: поудалял все - оставил пару элементов Теxt в карточке
А все равно тормозит.
По вводным: появляются рывки при прохождении границ элементов (ну понятно - создает новые композиции)

По вводным: и телефон то вроде норм - Samsung S23+

Нужно понять: неужели compose такой медленный?
Поделитесь опытом.

Нужно понять: оптимизирует ли compose при создании релизного билда?
По вводным: вроде в релизном билде работает побыстрее все-же.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Web-разработка Ответ

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)
    }
}

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.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно