From 242293abe81970f0afb8548a992c79cb548b1672 Mon Sep 17 00:00:00 2001 From: Christophe Beyls Date: Fri, 21 Mar 2025 15:23:10 +0100 Subject: [PATCH] refactor: cache filtered sessions and speakers between recompositions --- .../com/androidmakers/ui/agenda/AgendaPager.kt | 12 +++++++++--- .../androidmakers/ui/speakers/SpeakerListScreen.kt | 7 ++++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/shared/ui/src/commonMain/kotlin/com/androidmakers/ui/agenda/AgendaPager.kt b/shared/ui/src/commonMain/kotlin/com/androidmakers/ui/agenda/AgendaPager.kt index 906b74ab..868f45f9 100644 --- a/shared/ui/src/commonMain/kotlin/com/androidmakers/ui/agenda/AgendaPager.kt +++ b/shared/ui/src/commonMain/kotlin/com/androidmakers/ui/agenda/AgendaPager.kt @@ -12,6 +12,7 @@ import androidx.compose.material3.Text import androidx.compose.material3.pulltorefresh.PullToRefreshBox import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import com.androidmakers.ui.common.EmptyLayout @@ -68,18 +69,23 @@ fun AgendaPager( state = pagerState, ) { page -> val pullRefreshState = rememberPullToRefreshState() + val day = days[page] + val sessionsPerStartTime = remember(day, sessionFilters) { + day.sessions + .filter(sessionFilters) + .groupBy { it.startDate.formatShortTime() } + } PullToRefreshBox( isRefreshing = isRefreshing, onRefresh = onRefresh, state = pullRefreshState ) { - val sessions = days[page].sessions.filter(sessionFilters) - if (sessions.isEmpty()) { + if (sessionsPerStartTime.isEmpty()) { EmptyLayout() } else { AgendaColumn( - sessionsPerStartTime = sessions.groupBy { it.startDate.formatShortTime() }, + sessionsPerStartTime = sessionsPerStartTime, onSessionClick = onSessionClick, onApplyForAppClinicClick = onApplyForAppClinicClick, onSessionBookmark = onSessionBookmark diff --git a/shared/ui/src/commonMain/kotlin/com/androidmakers/ui/speakers/SpeakerListScreen.kt b/shared/ui/src/commonMain/kotlin/com/androidmakers/ui/speakers/SpeakerListScreen.kt index 33c8e61c..836f24bb 100644 --- a/shared/ui/src/commonMain/kotlin/com/androidmakers/ui/speakers/SpeakerListScreen.kt +++ b/shared/ui/src/commonMain/kotlin/com/androidmakers/ui/speakers/SpeakerListScreen.kt @@ -69,12 +69,13 @@ fun SpeakerScreen( } is Lce.Content -> { - var text by rememberSaveable { mutableStateOf("") } var expanded by rememberSaveable { mutableStateOf(false) } - val content = (state as Lce.Content).content - val filteredSpeakers = content.speakers.filter { it.name?.contains(text, ignoreCase = true) == true } + val speakers = (state as Lce.Content).content.speakers + val filteredSpeakers = remember(speakers, text) { + speakers.filter { it.name?.contains(text, ignoreCase = true) == true } + } var searchHeight by remember { mutableStateOf(56.dp) }