gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:18:41 26 4
gpt4 key购买 nike

如您所见,这就是我使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com