android - Jetpack compose NavHost 防止重新组合屏幕

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

如您所见,这就是我使用 MaterialBottomNavigation 实现 NavHost 的方式,我在这两个 上都有很多项目留言 供稿 屏幕,当我在它们两个屏幕之间导航时,它们会自动重新组合,但我不想因为那里有太多数据,所以它在导航时闪烁和 fps 下降到 10 以下,我尝试在 NavHost 之前初始化数据 View 模型,但结果仍然相同,是否存在任何方式来组成屏幕一次并在 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) }
  }
}

最佳答案

我有一个类似的问题。就我而言,我需要实例化一个 bool 状态“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()
    }        
}
使用此解决方案,我可以防止重组和“重新导航”。

我不知道我们是否需要在导航后意识到并构建可组合的想法来考虑这种重组,或者这应该是图书馆的责任。

关于android - Jetpack compose NavHost 防止重新组合屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67583404/

相关文章:

android - Unity-强制Android硬件加速

android - 是否可以在 PopupMenu 中显示图标?

android - 如何使用Kotlin Gradle DSL在Android项目中启用ViewBing?

java - 如何从 ViewPager (TabLayout) 内的 Activity 动态更改工具栏

android - Jetpack 撰写 : Content color of TabRow

android - 如何初始化 MutableLiveData 对象的集合值?

android - WorkManager 是否在满足所有约束后立即执行其 PeriodicWork?

android - 使用 Glide v4 预加载图像不起作用

android - Mockk 模拟 Kotlin 的私有(private)属性(property)

android - 如何在使用之前更改传入的修饰符?