Compose: пометил data class @Immutable, а рекомпозиция всё равно скачет

Теги: #VPN
Рейтинг: 34.2% · 20 голосов
Разработка под iOS и Android: Swift, SwiftUI, Kotlin, Jetpack Compose, Flutter, React Native, публикация в App Store и Google Play, оптимизация приложений.
Ответить
Аватара пользователя
syscode171
Сообщения: 8
Зарегистрирован: Вт май 12, 2026 1:43 pm

Compose: пометил data class @Immutable, а рекомпозиция всё равно скачет

Сообщение syscode171 »

Compose 1.6, есть LazyColumn на ~200 элементов. Повесил @Immutable на модель айтема, в Layout Inspector всё равно вижу что при скролле перекомпозятся видимые айтемы постоянно. Думал @Immutable это пофиксит. Где я туплю?
👍1 ❤️ 🔥1 😄 🤔
✔ Лучший ответ сформирован автоматически — anna2444
@Immutable говорит компилятору Compose что он может пропустить рекомпозицию если все параметры стабильны — но LazyColumn всё равно перекомпозирует айтемы при скролле если у самого LazyColumn меняется состояние. Проверь в Layout Inspector что именно триггерит рекомпозицию: если это сам LazyColumn реагирует на изменение списка или scroll state — @Immutable на айтеме тут не поможет. Нужно смотреть н…
Перейти к ответу →
Аватара пользователя
vera6255
Сообщения: 2
Зарегистрирован: Вт май 12, 2026 11:00 am

Re: Compose: пометил data class @Immutable, а рекомпозиция всё равно скачет

Сообщение vera6255 »

Скролл и должен рекомпозить новые появляющиеся айтемы, это норма. Проблема если перекомпозятся те что уже на экране и не менялись. Ты лямбды в onClick инлайнишь? Новый лямбда-инстанс каждый кадр = нестабильный параметр, и @Immutable модели тут не помогут.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
savva_io
Сообщения: 41
Зарегистрирован: Вс май 10, 2026 9:03 pm

Re: Compose: пометил data class @Immutable, а рекомпозиция всё равно скачет

Сообщение savva_io »

О, да, у меня onClick = { viewModel.select(item.id) } прямо в composable. Вынести в remember?
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
yaroslav_hex
Сообщения: 5
Зарегистрирован: Пн май 11, 2026 11:37 pm

Re: Compose: пометил data class @Immutable, а рекомпозиция всё равно скачет

Сообщение yaroslav_hex »

Лучше пробрось стабильную лямбду сверху или используй method reference. И проверь что у тебя в LazyColumn есть key = { it.id }, без него Compose не может матчить айтемы между кадрами. Включи Layout Inspector recomposition counts и смотри какой именно параметр прыгает — Compose compiler reports тоже помогает, он покажет какие классы он считает unstable.
👍5 ❤️4 🔥2 😄 🤔2
Аватара пользователя
sergey_async
Сообщения: 5
Зарегистрирован: Пн май 11, 2026 2:49 pm

Re: Compose: пометил data class @Immutable, а рекомпозиция всё равно скачет

Сообщение sergey_async »

key был, лямбда оказалась виновата — обернул, счётчик перестал расти. Спасибо, классика оказывается.
👍5 ❤️ 🔥2 😄3 🤔
Аватара пользователя
anna2444
Сообщения: 7
Зарегистрирован: Ср май 13, 2026 4:23 am

Re: Compose: пометил data class @Immutable, а рекомпозиция всё равно скачет

Сообщение anna2444 »

✔ Лучший ответ — сформирован автоматически
@Immutable говорит компилятору Compose что он может пропустить рекомпозицию если все параметры стабильны — но LazyColumn всё равно перекомпозирует айтемы при скролле если у самого LazyColumn меняется состояние. Проверь в Layout Inspector что именно триггерит рекомпозицию: если это сам LazyColumn реагирует на изменение списка или scroll state — @Immutable на айтеме тут не поможет. Нужно смотреть на лямбды которые ты передаёшь в itemContent — если они захватывают нестабильные переменные (например onClick с индексом), компилятор сочтёт их нестабильными и будет перекомпозировать.
👍 ❤️1 🔥 😄 🤔
Аватара пользователя
neonapi460
Сообщения: 28
Зарегистрирован: Вт май 12, 2026 4:00 pm

Re: Compose: пометил data class @Immutable, а рекомпозиция всё равно скачет

Сообщение neonapi460 »

Частая причина — лямбда-параметры в itemContent. Например `onClick = { onItemClick(item.id) }` создаёт новую лямбду при каждой рекомпозиции родителя, и даже @Immutable айтем перекомпозируется. Решение: обернуть в `remember(item.id) { { onItemClick(item.id) } }` или передавать стабильную ссылку на функцию. В Compose 1.7+ добавили компилер-плагин с улучшенным inference стабильности — попробуй включить `compose.compiler.reportsDestination` в gradle и посмотреть отчёт, там прямо написано почему класс считается нестабильным.
👍 ❤️ 🔥 😄 🤔
Ответить
Поделиться темой: ✈ Telegram VK

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость