Оптимизация рекомпозиции LazyColumn Jetpack ComposeAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Оптимизация рекомпозиции LazyColumn Jetpack Compose

Сообщение Anonymous »

Я разрабатываю приложение с помощью Jetpack Compose, которое упорядочивает элементы в три списка («Список 1», «Список 2», «Список 3»), каждый из которых представлен закрытым классом. Я пытаюсь предотвратить постоянные рекомпозиции компоновки, даже одно изменение isLoading приводит к перекомпоновке всего составного дерева, как это наблюдается в инспекторе макетов, а также не может применять анимацию к этим элементам, когда они меняют положение или вставляются/удаляются с помощью animateItemPlacement(), но анимация не запускается, потому что LazyColumn постоянно перекомпоновывает каждый раз, когда обновляется состояние.
Состояние хранится во ViewModel, а также обновляется оттуда следующим образом:

Код: Выделить всё

casualViewState.updateState { copy(loading = loading) }
Вот упрощенная версия моей реализации:

Код: Выделить всё

data class ListViewModelState(
val list1Items: List,
val list2Items: List,
val list3Items: List,
val isLoading: Boolean
)

sealed class ItemType(val id: String) {
data class ItemDetailA(val detail: Detail) : ItemType(detail.id)
data class ItemDetailB(val note: Note) : ItemType(note.id)
}

Код: Выделить всё

@Composable
fun GenericListView(state: ListViewModelState) {
LazyColumn {
items(state.list1Items, key = { it.id }) { item ->
GenericItemView(item)
}
items(state.list2Items, key = { it.id }) { item ->
GenericItemView(item)
}
items(state.list3Items, key = { it.id }) { item ->
GenericItemView(item)
}
}
}
несмотря на все усилия, списки по-прежнему полностью перестраиваются при каждом обновлении состояния. Что может быть причиной непрерывной полной перекомпоновки LazyColumn, а не только отдельных измененных элементов?
Я пробовал использовать уникальные ключи и аннотации @Stable и @Immutable для более эффективного управления перекомпоновкой. . Также попробовал удалить передаваемые параметры и модификаторы, созданные с помощью составного метода, среди составных объектов.

Подробнее здесь: https://stackoverflow.com/questions/784 ... ck-compose
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»