【问题标题】:Jetpack compose NavHost prevent recomposition screensJetpack compose NavHost 防止重新组合屏幕
【发布时间】:2021-05-18 09:21:56
【问题描述】:

正如您所见,这就是我使用 MaterialBottomNavigation 实现 NavHost 的方式,我在 MessagesFeeds 屏幕上都有很多项目,当我在这两个屏幕之间导航时,它们会自动重新组合但我不想因为那里有太多数据它在导航时闪烁并且 fps 下降到 10 以下,我尝试在 NavHost 之前初始化数据视图模型但结果仍然相同,有没有办法组合屏幕一次并在视图模型时更新它们数据更新了吗?

@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) }
  }
}

【问题讨论】:

  • 您找到解决方案了吗?我希望解决相同的行为。
  • @Jackson 我也有兴趣解决这样的问题。找到解决方案了吗?

标签: android kotlin android-jetpack android-jetpack-compose android-jetpack-navigation


【解决方案1】:

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

问题是:
-> 屏幕 1 应该导航到屏幕 2;
-> 屏幕 1 有一个条件语句,用于直接导航到屏幕 2 或显示带有导航到屏幕 2 的操作按钮的内容屏幕;
-> 导航到屏幕 2 后,屏幕 1 重新组合并再次到达 if 语句,从而导致“导航循环”。

val hasAlreadyNavigated = remember { mutableStateOf(false) }

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

使用此解决方案,我可以防止重组和“重新导航”。
我不知道我们是否需要了解并构建可组合物,考虑导航后的这种重组,或者它应该是图书馆的责任。

【讨论】:

    【解决方案2】:

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

    val navController = rememberNavController()
    

    欲了解更多信息,请查看: https://developer.android.com/jetpack/compose/navigation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-01
      • 2021-10-13
      • 2022-06-13
      • 2021-10-09
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      • 2021-10-05
      相关资源
      最近更新 更多