提问者:小点点

Jetpack撰写NavHost防止重组屏幕


正如你所看到的,这就是我用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个答案

匿名用户

我也有类似的问题。在我的例子中,我需要实例化一个布尔状态“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()
    }        
}

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

匿名用户

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

val navController = rememberNavController()

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