From 5ea1ca512401d481a1df837e019cefdeb9b38876 Mon Sep 17 00:00:00 2001 From: Jeena Date: Sun, 11 Oct 2026 05:17:12 +0000 Subject: [PATCH] ui: Fix recompose loop during scroll (2fps vertical) Focus requesters were stored in snapshot-state maps and written during composition of every list item: each write invalidated the reading scope, which recomposed the (whole page of) items, wrote again, ... This feedback loop is why vertical scrolling ran at ~2fps on the TV while the same build scrolled fine in the emulator's short bursts. Plain HashMaps kill the loop - focus handling needs no recomposition. --- .../main/java/net/jeena/jtubetv/ui/screens/ChannelsScreen.kt | 2 +- app/src/main/java/net/jeena/jtubetv/ui/screens/HomeRows.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/net/jeena/jtubetv/ui/screens/ChannelsScreen.kt b/app/src/main/java/net/jeena/jtubetv/ui/screens/ChannelsScreen.kt index 00ca382..fa76b3a 100644 --- a/app/src/main/java/net/jeena/jtubetv/ui/screens/ChannelsScreen.kt +++ b/app/src/main/java/net/jeena/jtubetv/ui/screens/ChannelsScreen.kt @@ -237,7 +237,7 @@ private fun ChannelCardRow( onLeftAtStart: () -> Unit, ) { val rowState = androidx.compose.foundation.lazy.rememberLazyListState() - val focusRequesters = remember { mutableMapOf() } + val focusRequesters = remember { HashMap() } var focusedIndex by remember { mutableIntStateOf(-1) } var clickedIndex by remember { mutableIntStateOf(-1) } diff --git a/app/src/main/java/net/jeena/jtubetv/ui/screens/HomeRows.kt b/app/src/main/java/net/jeena/jtubetv/ui/screens/HomeRows.kt index 625a6d0..69dafd1 100644 --- a/app/src/main/java/net/jeena/jtubetv/ui/screens/HomeRows.kt +++ b/app/src/main/java/net/jeena/jtubetv/ui/screens/HomeRows.kt @@ -260,7 +260,7 @@ fun FocusScrollRow( afterItem: @Composable (index: Int, video: VideoDto) -> Unit = { _, _ -> }, ) { val rowState = rememberLazyListState() - val focusRequesters = remember { androidx.compose.runtime.mutableStateMapOf() } + val focusRequesters = remember { HashMap() } var focusedIndex by remember { androidx.compose.runtime.mutableStateOf(-1) } // BACK from playback: scroll to + focus the card that was opened (user request). LaunchedEffect(restoreToken) {