From 17906ab3f690c87ac87afa6bd10147a7049a11f4 Mon Sep 17 00:00:00 2001 From: Ivan Morgillo Date: Tue, 14 Jan 2025 17:07:29 +0100 Subject: [PATCH] fix excessive recompositions in SelectableLazyColumn reference https://github.com/JetBrains/jewel/pull/723 closes https://github.com/JetBrains/intellij-community/pull/2905 (cherry picked from commit c7cf1e0405ac1894c7318627381dfb39dd0e0b20) (cherry picked from commit 0ee0e01e668d629d6216eaf15552c0b26d13f774) IJ-MR-155570 GitOrigin-RevId: 0bdf49d3a02e534b6c3a783de36534443afb15a1 --- .../foundation/lazy/SelectableLazyColumn.kt | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/platform/jewel/foundation/src/main/kotlin/org/jetbrains/jewel/foundation/lazy/SelectableLazyColumn.kt b/platform/jewel/foundation/src/main/kotlin/org/jetbrains/jewel/foundation/lazy/SelectableLazyColumn.kt index 06373101dab4..e688dfada498 100644 --- a/platform/jewel/foundation/src/main/kotlin/org/jetbrains/jewel/foundation/lazy/SelectableLazyColumn.kt +++ b/platform/jewel/foundation/src/main/kotlin/org/jetbrains/jewel/foundation/lazy/SelectableLazyColumn.kt @@ -15,9 +15,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.setValue -import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusDirection @@ -59,19 +57,20 @@ public fun SelectableLazyColumn( content: SelectableLazyListScope.() -> Unit, ) { val scope = rememberCoroutineScope() - val container = SelectableLazyListScopeContainer().apply(content) + val container = remember(content) { SelectableLazyListScopeContainer().apply(content) } val keys = remember(container) { container.getKeys() } var isFocused by remember { mutableStateOf(false) } - val latestOnSelectedIndexesChanged = rememberUpdatedState(onSelectedIndexesChange) - LaunchedEffect(state, container) { - snapshotFlow { state.selectedKeys } - .collect { selectedKeys -> - val indices = selectedKeys.mapNotNull { key -> container.getKeyIndex(key) } - latestOnSelectedIndexesChanged.value.invoke(indices) - } + var lastSelectedKeys by remember { mutableStateOf(state.selectedKeys) } + LaunchedEffect(state.selectedKeys, onSelectedIndexesChange, container) { + if (lastSelectedKeys == state.selectedKeys) return@LaunchedEffect + + val indices = state.selectedKeys.mapNotNull { key -> container.getKeyIndex(key) } + lastSelectedKeys = state.selectedKeys + onSelectedIndexesChange(indices) } + val focusManager = LocalFocusManager.current val focusRequester = remember { FocusRequester() } LazyColumn(