Код: Выделить всё
@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 },
)
Я уже рассматривал возможность поднятия логики «списка обновления» в onClick каждого FilterChip из компонент - однако кажется разумным, чтобы этот компонент выполнял эту логику, поскольку это поведение всегда будет одинаковым и будет дублироваться только каждый раз, когда используется MultiSelectGroup. Я также пытался использовать комбинации mutableStateList, key и DerivedStatedOf, но мне еще предстоит найти работающее решение.
Это такой компонент обречен всегда перекомпоновать каждого из своих дочерних элементов? Или есть способ оптимизировать рекомпозицию для такого вида представления? Заранее спасибо!
Подробнее здесь: https://stackoverflow.com/questions/768 ... ck-compose
Мобильная версия