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

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

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

Сообщение depechie »

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

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

Сообщение icu2 »

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

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

Сообщение go_pro »

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

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

Сообщение kernel_veteran »

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

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

Сообщение envoycoder »

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

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

Сообщение mgyorko »

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

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

Сообщение depechie »

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

Вернуться в «Мобильная разработка»

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

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