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

Jetpack撰写NavHost防止重组屏幕

轩辕欣可
2023-03-14

正如你所看到的,这就是我用MaterialBottomNavigation实现NavHost的方式,我在消息和提要屏幕上都有很多项目,当我在它们两个屏幕之间导航时,它们会自动重构,但我不想这样做,因为那里有很多数据,它在导航时闪烁和fps下降到10以下,我试图在NavHost之前初始化数据viewModels,但结果仍然相同, 有没有办法一次组成屏幕,并在viewModels数据更新时更新它们?

@Composable
private fun MainScreenNavigationConfigurations(
    navController: NavHostController,
    messagesViewModel: MessagesViewModel = viewModel(),
    feedsViewModel: FeedsViewModel = viewModel(),

) {

val messages: List<Message> by messagesViewModel.messages.observeAsState(listOf())
val feeds: List<Feed> by feedsViewModel.messages.observeAsState(listOf())

NavHost(
    navController = navController,
    startDestination = "Messages"
) {
    composable("Messages") {
        Messages(navController, messages)
    }
    composable("Feeds") { Feeds(navController, feeds) }
  }
}

共有2个答案

姬宝
2023-03-14

请在您的代码上方使用此代码。它会记住您当前屏幕的状态。

val navController = rememberNavController()

有关更多信息,请查看以下内容: https://developer.android.com/jetpack/compose/navigation

常睿范
2023-03-14

我也有类似的问题。在我的例子中,我需要实例化一个布尔状态“hasAlreadyNavigated”。

问题是:< br> -

val hasAlreadyNavigated = remember { mutableStateOf(false) }

if (!hasAlreadyNavigated.value) {
    if (!screen1ViewModel.canNavigate()) {
        Screen1Content{
            hasAlreadyNavigated.value = true
            screen1ViewModel.allowNavigation()
            navigateToScreen2()
        }
    } else {
        hasAlreadyNavigated.value = true
        navigateToScreen2()
    }        
}

有了这个解决方案,我可以防止重组和“重新导航”。
我不知道我们是否需要在导航后意识到并构建这种重组的组合物,或者这应该是图书馆的责任。

 类似资料:
  • 所以我试图用Jetpack Compose创建一个应用程序。我有一个屏幕功能,它包含一个没有顶部应用程序栏的脚手架,一个用于导航的底部栏和一个设置在底部栏中的浮动操作按钮。这一切都很好。 但是,当我将NavHost添加到脚手架的内容时,整个事情就停止了工作。没有NavHost,一切都很好,只是内容是屏幕的可组合功能。我尝试了不同数量的NavHost可组合位置,不同的填充值都无济于事。 没有NavH

  • 如何在JetPack Compose BottomSheet状态更改上实现回调/侦听器机制? 类似的东西: 正如我们过去在Java/静态编程语言中所做的那样。 现在,我正在将其作为lambda传递给另一个需要关闭底片的可组合。 但是我想得到一个回调,底部的工作表已经完全折叠,我可以继续我的任务。 我面临的实际问题:我正在通过按钮单击将可组合文件转换为位图。按钮在BottomSheet内部,需要转换

  • 是否有一种方法可以防止重写我在映射器类中为其提供了实现的特定方法? null 我的映射器类如下所示: 然后,Mapstruct生成如下所示的实现:

  • 这是我的导航主机 我从主屏幕到“开始”屏幕很幼稚,但没有从“开始”导航到“计时器”屏幕,我已经传递了与从主屏幕获得的相同的ID。 这个主要可组合的 开始屏幕 当我点击按钮时,应用程序崩溃,错误如下

  • 我正在尝试创建一个底部有隐藏按钮的项目列表。默认情况下,按钮在屏幕上不可见。 如果用户滚动到列表底部,则该按钮应显示为列表的最后一项。 我创作了插图来更好地形象化期望的行为: 草图1:包含几个项目的列表 草图2:有很多项目的列表 我已经尝试了类似问题的解决方案(https://stackoverflow.com/a/69196765/11720296),并添加了额外的偏移量,但不幸的是它不起作用。

  • 目前在Jetpack Compose中,此代码会抛出一个,因为您无法嵌套两个垂直滚动的Composables: 我不希望网格本身滚动,而只是显示我传递到其中的可组合的固定网格。在 中显示非滚动网格是否有任何解决方法?