Compose Wear OS 导航和旋转输入

问题描述 投票:0回答:1

当我使用 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事件已创建但未消耗'

android-jetpack-compose wear-os jetpack-compose-navigation compose-wear
1个回答
0
投票
解决了

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() } }
    
© www.soinside.com 2019 - 2024. All rights reserved.