当我使用 ScalingLazyColumns 在两个 Scaffold 可组合项之间进行导航时,我无法在 Wear OS 撰写应用程序上使用旋转输入。
我正在使用简单的导航在两个脚手架可组合项之间导航(每个都带有scalinglazycolumn)。
SwipeDismissableNavHost(
//modifier = Modifier.background(Color.Black),
navController = navController,
startDestination = "main_screen"
) {
composable("settings") {
Settings(
coroutineScope = coroutineScope,
viewModel = viewModel,
context = context,
...
)
}
composable("main_screen") {
TodayWeatherLayout(
coroutineScope = coroutineScope,
navController = navController,
context = context,
scope = scope,
viewModel = viewModel,
...
)
}
}
在主屏幕上,我通过单击按钮输入设置
onClick = {
navController.navigate("settings")
}
这就是两个可组合屏幕的样子
Scaffold(
modifier = Modifier.fillMaxSize(),
timeText = { TimeText(
modifier = Modifier.scrollAway(listState, itemIndex = 0, offset = 80.dp),
timeSource = TimeTextDefaults.timeSource(format),
) },
positionIndicator = { PositionIndicator(scalingLazyListState = listState) }
){
val focusRequester = remember { FocusRequester() }
LaunchedEffect(Unit){focusRequester.requestFocus()}
ScalingLazyColumn(
modifier = Modifier
.fillMaxSize()
.onRotaryScrollEvent {
coroutineScope.launch {
listState.scrollBy(it.verticalScrollPixels * 2)
listState.animateScrollBy(0f)
}
true
}
.focusRequester(focusRequester)
.focusable(),
//anchorType = ScalingLazyListAnchorType.ItemStart,
//autoCentering = AutoCenteringParams(itemIndex = 1),
autoCentering = null,
contentPadding = PaddingValues(start = 8.dp, end = 8.dp, top = 40.dp, bottom = 60.dp),
state = listState,
){
.... [COLUMN ITEMS]
}
}
不幸的是,使用旋转输入滚动仅在我进入应用程序(主屏幕)时才有效。当我进入“设置”时,我无法再通过旋转表冠滚动。 (旋转输入)。当我离开“设置”时,旋转输入在“主屏幕”中也不再起作用。
在两个屏幕中我都请求焦点
val focusRequester = remember { FocusRequester() }
LaunchedEffect(Unit){focusRequester.requestFocus()}
我的导航实现有问题吗?滑动滚动在“主屏幕”和“设置”中都可以正常工作
在logcat中我只能看到:'Rotary事件已创建但未消耗'
LaunchedEffect(Unit) {
lifecycleOwner.repeatOnLifecycle(state = Lifecycle.State.RESUMED) {
try {
focusRequester.requestFocus()
} catch (e: IllegalStateException) {
Log.w(TAG, "Focus Requester not working", e)
}
}}
还有
LocalView.current.viewTreeObserver.addOnWindowFocusChangeListener {
if (it) {
focusRequester.requestFocus()
}
}