Skip to content

Commit 3051835

Browse files
committed
将 createCustomInitialFocusRestorerModifiers 替换为 Modifier.focusRequester
更新依赖后恢复焦点用的 createCustomInitialFocusRestorerModifiers 出现了问题,翻阅代码发现可以使用 Modifier.focusRequester 替代
1 parent a331f75 commit 3051835

File tree

17 files changed

+134
-96
lines changed

17 files changed

+134
-96
lines changed

app/shared/src/main/kotlin/dev/aaa1115910/bv/component/TopNav.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ import androidx.compose.runtime.mutableStateOf
1616
import androidx.compose.runtime.remember
1717
import androidx.compose.runtime.setValue
1818
import androidx.compose.ui.Modifier
19+
import androidx.compose.ui.focus.FocusRequester
20+
import androidx.compose.ui.focus.focusRequester
21+
import androidx.compose.ui.focus.focusRestorer
1922
import androidx.compose.ui.platform.LocalContext
2023
import androidx.compose.ui.unit.dp
2124
import androidx.tv.material3.LocalContentColor
@@ -27,7 +30,6 @@ import androidx.tv.material3.Text
2730
import dev.aaa1115910.biliapi.entity.pgc.PgcType
2831
import dev.aaa1115910.biliapi.entity.ugc.UgcTypeV2
2932
import dev.aaa1115910.bv.BVApp
30-
import dev.aaa1115910.bv.util.createCustomInitialFocusRestorerModifiers
3133
import dev.aaa1115910.bv.util.getDisplayName
3234
import dev.aaa1115910.bv.util.ifElse
3335

@@ -39,7 +41,7 @@ fun TopNav(
3941
onSelectedChanged: (TopNavItem) -> Unit = {},
4042
onClick: (TopNavItem) -> Unit = {}
4143
) {
42-
val focusRestorerModifiers = createCustomInitialFocusRestorerModifiers()
44+
val focusRequester = remember { FocusRequester() }
4345

4446
var selectedNav by remember { mutableStateOf(items.first()) }
4547
var selectedTabIndex by remember { mutableIntStateOf(0) }
@@ -55,15 +57,14 @@ fun TopNav(
5557
horizontalArrangement = Arrangement.Center
5658
) {
5759
TabRow(
58-
modifier = Modifier
59-
.then(focusRestorerModifiers.parentModifier),
60+
modifier = Modifier.focusRestorer(focusRequester),
6061
selectedTabIndex = selectedTabIndex,
6162
separator = { Spacer(modifier = Modifier.width(12.dp)) },
6263
) {
6364
items.forEachIndexed { index, tab ->
6465
NavItemTab(
6566
modifier = Modifier
66-
.ifElse(index == 0, focusRestorerModifiers.childModifier),
67+
.ifElse(index == 0, Modifier.focusRequester(focusRequester)),
6768
topNavItem = tab,
6869
selected = index == selectedTabIndex,
6970
onFocus = {

app/shared/src/main/kotlin/dev/aaa1115910/bv/component/pgc/IndexFilter.kt

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ import androidx.compose.runtime.remember
2727
import androidx.compose.runtime.setValue
2828
import androidx.compose.ui.Alignment
2929
import androidx.compose.ui.Modifier
30+
import androidx.compose.ui.focus.FocusRequester
31+
import androidx.compose.ui.focus.focusRequester
32+
import androidx.compose.ui.focus.focusRestorer
3033
import androidx.compose.ui.platform.LocalContext
3134
import androidx.compose.ui.res.stringResource
3235
import androidx.compose.ui.tooling.preview.Preview
@@ -55,10 +58,9 @@ import dev.aaa1115910.biliapi.entity.pgc.index.SpokenLanguage
5558
import dev.aaa1115910.biliapi.entity.pgc.index.Style
5659
import dev.aaa1115910.biliapi.entity.pgc.index.Year
5760
import dev.aaa1115910.bv.R
58-
import dev.aaa1115910.bv.util.ifElse
5961
import dev.aaa1115910.bv.ui.theme.BVTheme
60-
import dev.aaa1115910.bv.util.createCustomInitialFocusRestorerModifiers
6162
import dev.aaa1115910.bv.util.getDisplayName
63+
import dev.aaa1115910.bv.util.ifElse
6264

6365
@Composable
6466
fun IndexFilter(
@@ -275,7 +277,7 @@ private fun <T> IndexFilterChipRow(
275277
onFilterChange: (T) -> Unit
276278
) {
277279
val context = LocalContext.current
278-
val focusRestorerModifiers = createCustomInitialFocusRestorerModifiers()
280+
val focusRequester = remember { FocusRequester() }
279281

280282
Row(
281283
horizontalArrangement = Arrangement.spacedBy(8.dp),
@@ -287,14 +289,17 @@ private fun <T> IndexFilterChipRow(
287289
)
288290
LazyRow(
289291
modifier = modifier
290-
.then(focusRestorerModifiers.parentModifier),
292+
.focusRestorer(focusRequester),
291293
horizontalArrangement = Arrangement.spacedBy(8.dp),
292294
contentPadding = PaddingValues(horizontal = 8.dp, vertical = 4.dp)
293295
) {
294296
items(items = filters) { filter ->
295297
IndexFilterChip(
296298
modifier = Modifier
297-
.ifElse(selectedFilter == filter, focusRestorerModifiers.childModifier),
299+
.ifElse(
300+
selectedFilter == filter,
301+
Modifier.focusRequester(focusRequester)
302+
),
298303
selected = selectedFilter == filter,
299304
onClick = { onFilterChange(filter) },
300305
label = (filter as PgcIndexParam).getDisplayName(context)

app/shared/src/main/kotlin/dev/aaa1115910/bv/component/videocard/VideosRow.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ import androidx.compose.runtime.remember
1717
import androidx.compose.runtime.setValue
1818
import androidx.compose.ui.Alignment
1919
import androidx.compose.ui.Modifier
20+
import androidx.compose.ui.focus.FocusRequester
21+
import androidx.compose.ui.focus.focusRequester
22+
import androidx.compose.ui.focus.focusRestorer
2023
import androidx.compose.ui.focus.onFocusChanged
2124
import androidx.compose.ui.graphics.Color
2225
import androidx.compose.ui.layout.onGloballyPositioned
@@ -29,7 +32,6 @@ import androidx.tv.material3.ButtonDefaults
2932
import androidx.tv.material3.MaterialTheme
3033
import androidx.tv.material3.Text
3134
import dev.aaa1115910.bv.entity.carddata.VideoCardData
32-
import dev.aaa1115910.bv.util.createCustomInitialFocusRestorerModifiers
3335
import dev.aaa1115910.bv.util.ifElse
3436

3537
@Composable
@@ -42,9 +44,9 @@ fun VideosRow(
4244
onOpenSeasonInfo: (VideoCardData) -> Unit = {},
4345
onOpenVideoInfo: (VideoCardData) -> Unit = {}
4446
) {
45-
val focusRestorerModifiers = createCustomInitialFocusRestorerModifiers()
4647
val context = LocalContext.current
4748
val density = LocalDensity.current
49+
val focusRequester = remember { FocusRequester() }
4850
var hasFocus by remember { mutableStateOf(false) }
4951
val titleColor = if (hasFocus) Color.White else Color.White.copy(alpha = 0.6f)
5052
val titleFontSize by animateFloatAsState(
@@ -65,7 +67,7 @@ fun VideosRow(
6567
LazyRow(
6668
modifier = Modifier
6769
.padding(top = 15.dp)
68-
.then(focusRestorerModifiers.parentModifier)
70+
.focusRestorer(focusRequester)
6971
.onGloballyPositioned {
7072
rowHeight = with(density) {
7173
it.size.height.toDp()
@@ -79,7 +81,7 @@ fun VideosRow(
7981
SmallVideoCard(
8082
modifier = Modifier
8183
.width(200.dp)
82-
.ifElse(index == 0, focusRestorerModifiers.childModifier),
84+
.ifElse(index == 0, Modifier.focusRequester(focusRequester)),
8385
data = videoData,
8486
onClick = {
8587
if (videoData.jumpToSeason) {

app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/SeasonInfoScreen.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import androidx.compose.ui.draw.drawWithContent
5656
import androidx.compose.ui.draw.rotate
5757
import androidx.compose.ui.focus.FocusRequester
5858
import androidx.compose.ui.focus.focusRequester
59+
import androidx.compose.ui.focus.focusRestorer
5960
import androidx.compose.ui.focus.onFocusChanged
6061
import androidx.compose.ui.graphics.BlendMode
6162
import androidx.compose.ui.graphics.Brush
@@ -94,14 +95,13 @@ import dev.aaa1115910.bv.component.buttons.SeasonInfoButtons
9495
import dev.aaa1115910.bv.entity.proxy.ProxyArea
9596
import dev.aaa1115910.bv.player.entity.VideoListPgcEpisode
9697
import dev.aaa1115910.bv.repository.VideoInfoRepository
98+
import dev.aaa1115910.bv.tv.activities.video.VideoInfoActivity
99+
import dev.aaa1115910.bv.tv.util.launchPlayerActivity
97100
import dev.aaa1115910.bv.ui.theme.BVTheme
98101
import dev.aaa1115910.bv.util.ImageSize
99-
import dev.aaa1115910.bv.util.createCustomInitialFocusRestorerModifiers
100102
import dev.aaa1115910.bv.util.fInfo
101103
import dev.aaa1115910.bv.util.focusedScale
102104
import dev.aaa1115910.bv.util.ifElse
103-
import dev.aaa1115910.bv.tv.activities.video.VideoInfoActivity
104-
import dev.aaa1115910.bv.tv.util.launchPlayerActivity
105105
import dev.aaa1115910.bv.util.requestFocus
106106
import dev.aaa1115910.bv.util.resizedImageUrl
107107
import dev.aaa1115910.bv.util.swapList
@@ -788,7 +788,7 @@ fun SeasonEpisodeRow(
788788
lastPlayedTime: Int = 0,
789789
onClick: (avid: Long, cid: Long, epid: Int, episodeTitle: String, startTime: Int) -> Unit
790790
) {
791-
val focusRestorerModifiers = createCustomInitialFocusRestorerModifiers()
791+
val focusRequester = remember { FocusRequester() }
792792
var hasFocus by remember { mutableStateOf(false) }
793793
val titleColor = if (hasFocus) Color.White else Color.White.copy(alpha = 0.6f)
794794
val titleFontSize by animateFloatAsState(
@@ -813,7 +813,7 @@ fun SeasonEpisodeRow(
813813
LazyRow(
814814
modifier = Modifier
815815
.padding(top = 15.dp)
816-
.then(focusRestorerModifiers.parentModifier),
816+
.focusRestorer(focusRequester),
817817
contentPadding = PaddingValues(horizontal = 50.dp),
818818
horizontalArrangement = Arrangement.spacedBy(24.dp),
819819
) {
@@ -846,7 +846,7 @@ fun SeasonEpisodeRow(
846846
val episodeTitle by remember { mutableStateOf(if (episode.longTitle != "") episode.longTitle else episode.title) }
847847
SeasonEpisodeButton(
848848
modifier = Modifier
849-
.ifElse(index == 0, focusRestorerModifiers.childModifier),
849+
.ifElse(index == 0, Modifier.focusRequester(focusRequester)),
850850
partTitle = if (title == "正片") {
851851
//如果 title 是数字的话,就会返回 "第 x 集"
852852
//如果 title 不是数字的话(例如 SP),就会原样使用 title

app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/VideoInfoScreen.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import androidx.compose.ui.draw.clip
5555
import androidx.compose.ui.draw.rotate
5656
import androidx.compose.ui.focus.FocusRequester
5757
import androidx.compose.ui.focus.focusRequester
58+
import androidx.compose.ui.focus.focusRestorer
5859
import androidx.compose.ui.focus.onFocusChanged
5960
import androidx.compose.ui.graphics.Color
6061
import androidx.compose.ui.layout.ContentScale
@@ -116,7 +117,6 @@ import dev.aaa1115910.bv.tv.activities.video.VideoInfoActivity
116117
import dev.aaa1115910.bv.tv.util.launchPlayerActivity
117118
import dev.aaa1115910.bv.ui.theme.BVTheme
118119
import dev.aaa1115910.bv.util.Prefs
119-
import dev.aaa1115910.bv.util.createCustomInitialFocusRestorerModifiers
120120
import dev.aaa1115910.bv.util.fDebug
121121
import dev.aaa1115910.bv.util.fInfo
122122
import dev.aaa1115910.bv.util.fWarn
@@ -1103,7 +1103,7 @@ fun VideoPartRow(
11031103
subtitle: String = "",
11041104
onClick: (cid: Long) -> Unit
11051105
) {
1106-
val focusRestorerModifiers = createCustomInitialFocusRestorerModifiers()
1106+
val focusRequester = remember { FocusRequester() }
11071107
var hasFocus by remember { mutableStateOf(false) }
11081108
var showPartListDialog by remember { mutableStateOf(false) }
11091109
val titleColor = if (hasFocus) Color.White else Color.White.copy(alpha = 0.6f)
@@ -1130,7 +1130,7 @@ fun VideoPartRow(
11301130
LazyRow(
11311131
modifier = Modifier
11321132
.padding(top = 15.dp)
1133-
.then(focusRestorerModifiers.parentModifier),
1133+
.focusRestorer(focusRequester),
11341134
contentPadding = PaddingValues(12.dp),
11351135
horizontalArrangement = Arrangement.spacedBy(16.dp)
11361136
) {
@@ -1144,7 +1144,7 @@ fun VideoPartRow(
11441144
itemsIndexed(items = pages, key = { _, page -> page.cid }) { index, page ->
11451145
VideoPartButton(
11461146
modifier = Modifier
1147-
.ifElse(index == 0, focusRestorerModifiers.childModifier),
1147+
.ifElse(index == 0, Modifier.focusRequester(focusRequester)),
11481148
index = index + 1,
11491149
title = page.title,
11501150
played = if (page.cid == lastPlayedCid) lastPlayedTime else 0,
@@ -1175,7 +1175,7 @@ fun VideoUgcSeasonRow(
11751175
onClickEp: (avid: Long, cid: Long) -> Unit,
11761176
onClickEpPart: (episode: Episode, cid: Long) -> Unit
11771177
) {
1178-
val focusRestorerModifiers = createCustomInitialFocusRestorerModifiers()
1178+
val focusRequester = remember { FocusRequester() }
11791179
var hasFocus by remember { mutableStateOf(false) }
11801180
var showUgcListDialog by remember { mutableStateOf(false) }
11811181
val titleColor = if (hasFocus) Color.White else Color.White.copy(alpha = 0.6f)
@@ -1200,7 +1200,7 @@ fun VideoUgcSeasonRow(
12001200
LazyRow(
12011201
modifier = Modifier
12021202
.padding(top = 15.dp)
1203-
.then(focusRestorerModifiers.parentModifier),
1203+
.focusRestorer(focusRequester),
12041204
contentPadding = PaddingValues(12.dp),
12051205
horizontalArrangement = Arrangement.spacedBy(16.dp)
12061206
) {
@@ -1214,7 +1214,7 @@ fun VideoUgcSeasonRow(
12141214
itemsIndexed(items = episodes) { index, episode ->
12151215
VideoPartButton(
12161216
modifier = Modifier
1217-
.ifElse(index == 0, focusRestorerModifiers.childModifier)
1217+
.ifElse(index == 0, Modifier.focusRequester(focusRequester))
12181218
.onFocusChanged { if (it.hasFocus) focusingEpisode = episode },
12191219
index = index + 1,
12201220
title = episode.title,

app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/main/DrawerContent.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ import androidx.compose.runtime.remember
2323
import androidx.compose.runtime.setValue
2424
import androidx.compose.ui.Modifier
2525
import androidx.compose.ui.draw.clip
26+
import androidx.compose.ui.focus.FocusRequester
27+
import androidx.compose.ui.focus.focusRequester
28+
import androidx.compose.ui.focus.focusRestorer
2629
import androidx.compose.ui.focus.onFocusChanged
2730
import androidx.compose.ui.graphics.Color
2831
import androidx.compose.ui.graphics.vector.ImageVector
@@ -41,7 +44,6 @@ import androidx.tv.material3.Text
4144
import androidx.tv.material3.rememberDrawerState
4245
import coil.compose.AsyncImage
4346
import dev.aaa1115910.bv.ui.theme.BVTheme
44-
import dev.aaa1115910.bv.util.createCustomInitialFocusRestorerModifiers
4547
import dev.aaa1115910.bv.util.ifElse
4648
import dev.aaa1115910.bv.util.isDpadRight
4749
import dev.aaa1115910.bv.util.isKeyDown
@@ -59,7 +61,7 @@ fun NavigationDrawerScope.DrawerContent(
5961
onLogin: () -> Unit = {}
6062
) {
6163
var selectedItem by remember { mutableStateOf(DrawerItem.Home) }
62-
val focusRestorerModifiers = createCustomInitialFocusRestorerModifiers()
64+
val centerFocusRequester = remember { FocusRequester() }
6365

6466
LaunchedEffect(selectedItem) {
6567
onDrawerItemChanged(selectedItem)
@@ -127,8 +129,7 @@ fun NavigationDrawerScope.DrawerContent(
127129
)
128130
}
129131
LazyColumn(
130-
modifier = Modifier
131-
.then(focusRestorerModifiers.parentModifier),
132+
modifier = Modifier.focusRestorer(centerFocusRequester),
132133
verticalArrangement = Arrangement.Center
133134
) {
134135
listOf(
@@ -143,7 +144,7 @@ fun NavigationDrawerScope.DrawerContent(
143144
.onFocusChanged { if (it.hasFocus) selectedItem = item }
144145
.ifElse(
145146
item == DrawerItem.Home,
146-
focusRestorerModifiers.childModifier
147+
Modifier.focusRequester(centerFocusRequester)
147148
),
148149
onClick = { selectedItem = item },
149150
selected = selectedItem == item,

app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/main/ugc/UgcChildRegionButtons.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@ import androidx.compose.foundation.layout.padding
77
import androidx.compose.foundation.lazy.LazyRow
88
import androidx.compose.foundation.lazy.itemsIndexed
99
import androidx.compose.runtime.Composable
10+
import androidx.compose.runtime.remember
1011
import androidx.compose.ui.Alignment
1112
import androidx.compose.ui.Modifier
13+
import androidx.compose.ui.focus.FocusRequester
14+
import androidx.compose.ui.focus.focusRequester
15+
import androidx.compose.ui.focus.focusRestorer
1216
import androidx.compose.ui.platform.LocalContext
1317
import androidx.compose.ui.tooling.preview.Preview
1418
import androidx.compose.ui.unit.dp
@@ -17,7 +21,6 @@ import androidx.tv.material3.SuggestionChip
1721
import androidx.tv.material3.Text
1822
import dev.aaa1115910.biliapi.entity.ugc.UgcTypeV2
1923
import dev.aaa1115910.bv.ui.theme.BVTheme
20-
import dev.aaa1115910.bv.util.createCustomInitialFocusRestorerModifiers
2124
import dev.aaa1115910.bv.util.fInfo
2225
import dev.aaa1115910.bv.util.getDisplayName
2326
import dev.aaa1115910.bv.util.ifElse
@@ -54,16 +57,16 @@ fun UgcChildRegionButtonsContent(
5457
onClickChildRegion: (UgcTypeV2) -> Unit
5558
) {
5659
val context = LocalContext.current
57-
val focusRestorerModifiers = createCustomInitialFocusRestorerModifiers()
60+
val focusRequester = remember { FocusRequester() }
5861

5962
LazyRow(
60-
modifier = modifier.then(focusRestorerModifiers.parentModifier),
63+
modifier = modifier.focusRestorer(focusRequester),
6164
contentPadding = PaddingValues(horizontal = 24.dp),
6265
horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterHorizontally),
6366
) {
6467
itemsIndexed(items = childUgcTypes) { index, ugcType ->
6568
SuggestionChip(
66-
modifier = Modifier.ifElse(index == 0, focusRestorerModifiers.childModifier),
69+
modifier = Modifier.ifElse(index == 0, Modifier.focusRequester(focusRequester)),
6770
onClick = { onClickChildRegion(ugcType) }
6871
) {
6972
Text(text = ugcType.getDisplayName(context))

0 commit comments

Comments
 (0)