当前位置: 首页 > 知识库问答 >
问题:

在Jetpack编写中按下后退按钮时,滚动位置丢失

段干祺
2023-03-14

我使用的是底部导航栏,每个菜单将用户导航到特定的可组合屏幕。我使用了导航库来管理它们之间的导航。

我正在为所有可组合使用通用的ViewModel。我正在其中一个可组合中使用懒惰列,当我在底部导航栏中单击菜单项在菜单项之间导航时,它会按预期工作,在懒惰列的滚动位置保存的位置。

当我在具有一个lazyColumn的可组合屏幕中单击按钮(我已经将它编程为导航到导航图中的起始目的地)并导航回该按钮时,问题出现了,然后滚动位置被刷新为0。这是一个错误还是我做错了什么

以下是我的代码:

导航

@Composable
fun PopulateHomeComposables(navController: NavHostController,             
homeViewModel: HomeViewModel, lifecycleScope : LifecycleCoroutineScope) {
NavHost(navController = navController, startDestination = 
WHATS_NEW_COMPOSABLE) {

    composable(WHATS_NEW_COMPOSABLE) {
        WhatsNewComposable(navController)
    }
    composable(COMPLIMENTS_COMPOSABLE) {
        ComplimentsComposable(navController)
    }
    composable(INSIGHTS_COMPOSABLE) {
        InsightsComposable(navController)
    }
    composable(NOTIFICATIONS_COMPOSABLE) {

        NotificationsComposable(homeViewModel, lifecycleScope)
    }
    }
}

我的脚手架看起来像这样

Scaffold(
    topBar = {

    },
    content = {

    },
    floatingActionButton = {
    },
    bottomBar = {
        val items = listOf(BottomNavScreens.WhatsNew, 
BottomNavScreens.Compliments, BottomNavScreens.Insights, 
BottomNavScreens.Notifications)
        BottomNavigation {
            val navBackStackEntry by navController.currentBackStackEntryAsState()
            val currentRoute = navBackStackEntry?.destination?.route
            //draw the menu items for each one
            items.forEach {
                BottomNavigationItem(
                    icon = {
                        Icon(it.icon, it.label)
                    },
                    label = {
                        Text(it.label)
                    },
                    alwaysShowLabel = true,
                    selected = currentRoute == it.route,
                    onClick = {
                        navController.navigate(it.route) {
               // Pop up to the start destination of the graph to
               // avoid building up a large stack of destinations
                            // on the back stack as users select items
                            
navController.graph.startDestinationRoute?.let { route ->
                                popUpTo(route) {
                                    saveState = true
                                }
                            }
                     //Avoid multiple copies of the same estination when
                            //re selecting the same item
                            launchSingleTop = true
         //Restore state when re selecting a previously selected item
                            restoreState = true
                        }
                    }
                )
            }
        }
    }
)

共有1个答案

祁乐邦
2023-03-14

所以我解决了这个问题。由于我正在使用导航库,我希望它在使用底部NavBar时单击后退按钮时保存可组合的状态。但我所要做的就是在可组合文件中覆盖后退按钮,并添加一个功能以使用navHostController导航到起始目标。

//override the back button press to navigate back to the 
//whatsNewComposable
BackHandler {
    Timber.i("Back button clicked in notifications composable")

    navController.navigate("myStartDestinationRoute) {
    // Pop up to the start destination of the graph to
    // avoid building up a large stack of destinations
    // on the back stack as users select items
    navController.graph.startDestinationRoute?.let { route ->
        popUpTo(route) {
            saveState = true
        }
    }
    //Avoid multiple copies of the same destination when
    //re selecting the same item
    launchSingleTop = true
    //Restore state when re selecting a previously selected item
    restoreState = true
}
 类似资料:
  • 我有一个包含我的数据的listView,但我需要能够按下向上滚动的按钮(如果listView可以向上滚动)和向下滚动的按钮(如果listView可以向下滚动),而不是使用滚动条滚动 listView可以转到的最大Y位置 listView滚动到的当前Y位置 使用这些值,我可以编写其余的代码。

  • 在我的应用程序中,我有一个注销功能。如果用户单击注销,它将进入主屏幕。现在,我按下后退按钮退出我的应用程序。但我想要的是,我需要自动退出(即以编程方式退出),就像返回按钮功能一样。我知道,通过调用finish()可以实现该功能。但问题是,它会转到上一个活动。

  • 我正在编写一个使用ChessClock类的游戏应用程序。这两个运动员每人都有一个钟。时钟每十分之一秒向自己发送一个信息流,如果运行,则减少剩余时间。当时间到期时,时钟会调用父视图组中的一个方法,该方法会停止时钟并设置一个标志,该标志会导致忽略进一步的触摸事件,从而用户无法再移动工件。我正在用kotlin写作,但我认为java程序员也会明白这一点: 这可以正常工作,但是如果用户按下后退按钮然后开始一

  • 我正在使用android导航组件库。我用导航图设置了两个片段。我想在我的片段内按下后退按钮时做一些额外的动作。 我使用这段代码来处理工具栏上的按钮点击,但我也想处理后退按钮按下。我该怎么做?

  • 我对libGDX有一个问题,当我用后退按钮退出后恢复应用程序时,只有一个白色屏幕。 实际应用运行,接受触摸输入,播放声音,但屏幕只是白色。 我读过保持对纹理的静态引用可能会导致这个问题,但我没有这样做。 下面是我的资产代码如何工作的简化版本。 在按下后退按钮后返回应用程序时,重新创建AssetManager,重新打开SplashScreen(为白色),并更新AssetManager直到重新加载所有

  • 有什么方法可以添加滚动条以添加(已弃用)。Javadoc没有提到任何关于Jetpack撰写中的滚动条的内容。 在Jetpack Compose中有可能做到吗?还是不支持滚动条?