正如你所看到的,这就是我使用 MaterialBottomNavigation 实现 NavHost 的方式,我在两者上都有很多项目Messages and Feeds屏幕,当我在两个屏幕之间导航时,它们会自动重新组合,但我不想因为那里有太多数据而闪烁,导航时 fps 降至 10 以下,我尝试在 NavHost 之前初始化数据 viewModel,但结果仍然相同,是吗?有什么方法可以组合屏幕一次并在 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) }
}
}
我有类似的问题。就我而言,我需要实例化一个布尔状态“hasAlreadyNavigate”。
问题是:
->屏幕 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()
}
}
通过这个解决方案,我可以防止重组和“重新导航”。
我不知道我们是否需要意识到并构建可组合项,考虑导航后的这种重组,或者这应该是图书馆的责任。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)