Предотвращение ненужных рекомпозиций при обновлении списка в Jetpack ComposeAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Предотвращение ненужных рекомпозиций при обновлении списка в Jetpack Compose

Сообщение Anonymous »

Я пишу приложение для Android, используя Jetpack Compose. У меня есть Composable под названием MultiSelectGroup, который должен изменять и возвращать список вариантов выбора при каждом нажатии FilterChip. Вот код:

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

@OptIn(ExperimentalLayoutApi::class, ExperimentalMaterial3Api::class)
@Composable
fun MultiSelectGroup(
items: List,
currentSelections: List,
onSelectionsChanged: (List) -> Unit,
) {
FlowRow {
items.forEach { item ->
FilterChip(
label = { Text(item) },
selected = currentSelections.contains(item),
onClick = {
val newSelectedChips = currentSelections.toMutableList().apply {
if (contains(item)) {
remove(item)
} else {
add(item)
}
}
onSelectionsChanged(newSelectedChips)
},
)
}
}
}
В настоящее время этот компонент вызывается с использованием следующего кода:

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

val allItems = remember { (1..6).map {"$it"} }

val selectedItems = remember {
mutableStateOf(emptyList())
}

MultiSelectGroup(
items = allItems,
currentSelections = selectedItems,
onSelectionsChanged = { selectedItems.value = it },
)
Проблема в том, что этот подход кажется довольно неэффективным с точки зрения рекомпозиции; каждый раз, когда щелкают FilterChip, все FilterChip перестраиваются, независимо от того, меняются они визуально или нет. Насколько я понимаю, это связано с тем, что список переустанавливается, и, поскольку List является более нестабильным типом данных, Compose решает просто перерисовать все компоненты, зависящие от List, а не просто элементы в этом списке изменились.
Я уже рассматривал возможность поднятия логики «списка обновления» в onClick каждого FilterChip из компонент - однако кажется разумным, чтобы этот компонент выполнял эту логику, поскольку это поведение всегда будет одинаковым и будет дублироваться только каждый раз, когда используется MultiSelectGroup. Я также пытался использовать комбинации mutableStateList, key и DerivedStatedOf, но мне еще предстоит найти работающее решение.
Это такой компонент обречен всегда перекомпоновать каждого из своих дочерних элементов? Или есть способ оптимизировать рекомпозицию для такого вида представления? Заранее спасибо!

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

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

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

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

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

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