当前位置: 首页 > 知识库问答 >
问题:

底部导航Android喷气背包撰写问题

江超英
2023-03-14

以下是 BottomNav 实现的概述。该应用程序正确显示底部导航栏,但当选择某个项目时,它会多次调用NavHost。我看到Jetpack撰写样本 https://github.com/android/compose-samples/tree/main/Jetsnack 一个类似的问题。是否有任何解决方法可以避免多次Navhost调用?

@Composable
fun MainScreen() {
    val navController = rememberNavController()
    Scaffold(
        bottomBar = { BottomMenu(navController = navController) }
    ) {
        BottomNavGraphBar(navController = navController)
    }
}

// handling the click event

  BottomNavigationItem(
        
        onClick = {
            navController.navigate(screen.route) {
                popUpTo(navController.graph.findStartDestination().id)
                launchSingleTop = true
            }
        }
    )

//NavHost implementation
@Composable
fun BottomNavGraphBar(navController: NavHostController) {
    NavHost(
        navController = navController,
        startDestination = Screen.Home.route
    ) {
        composable(route = Screen.Home.route) {
            Log.d("BottomNavGraph","BottomNavGraph->HomeScreen")
            HomeScreen()
        }
        composable(route = Screen.Settings.route) {
            Log.d("BottomNavGraph","BottomNavGraph->AppSettingsScreen")
            AppSettingsScreen()
        }
        composable(route = Screen.Profile.route) {
            Log.d("BottomNavGraph","BottomNavGraph->ProfileScreen")
            ProfileScreen()
        }
    }
}

<!---LogCat-->
// When app is launched
BottomNavGraph->HomeScreen
BottomNavGraph->HomeScreen
// clicked on the profile.
BottomNavGraph->HomeScreen
BottomNavGraph->ProfileScreen
BottomNavGraph->HomeScreen
BottomNavGraph->ProfileScreen

共有1个答案

孔扬
2023-03-14

Compose可以(并且将根据多种情况)调用可组合函数来“重新组合”它们。尽管它是智能的,并且可以缓存可组合函数的输出以用于其先前的输入,因此它不必重新计算其结果(例如,它们发出的UI)。

在您的示例中,可组合(...){...}可能会被重新组合,但如果您在其中使用可组合(如一些Texts),它将使用其上次渲染中的缓存。

你不必担心你的函数被调用,但你必须处理好你的计算。这就是为什么您希望使用“记住”来计算某些内容并将其存储在缓存中,以便不再重新计算。

 类似资料:
  • 我想根据条件更改我的开始导航片段。我的起始片段可以是片段1或片段2。有没有办法实现它?

  • 我是jetpack compose的新手,从< code>JetpackCompose基础代码中学习它,所以我在创建一个高性能的懒惰列表中找到了它 注意:LazyColumn不会像那样回收其子项。当您滚动浏览它时,它会发出新的,并且仍然具有高性能,因为与实例化Android视图相比,发出相对便宜。 因此,发出新的可组合项是多么的便宜和高效,那么为什么不使用列并一次性组合整个列表,而不是在滚动时不断

  • 我创建了一个项目,并添加了插件和dependency,我还对其进行了测试,结果很好。但当我重构项目以使用并启用jetifier工具项目不会构建,我会遇到多个错误,如: 转换文件“crashlytics-2.9.2.aar”以匹配属性{artifactType=jetitied-aar}失败 似乎< code>jetifier工具和< code>Crashlytics依赖项有问题。有没有办法关闭单个

  • 我将我的按钮定义为这样的可组合按钮: 我已经检查了调试器,返回合适的颜色(白色)(0xFFFFFFFF) 但是我不能让按钮上的文字变成白色。 这是预览 设置会导致文本颜色的变化,但我想从按钮颜色设置它,而不是为文本设置一种唯一的颜色 将按钮的文本样式颜色设置为未指定后,它仍然不起作用: 形状是Android Studio项目生成器的默认形状 颜色 主题 排印

  • 我在jetpack撰写中使用了BottomSheet视图,但我想使用BotomSheet锁定屏幕,直到我们单击BotomShets的按钮并在BotomSheet中禁用外部触摸。我怎么做? 我的底单: 可组合函数是一个谷歌地图屏幕

  • 我正在将一个片段从旧的Jetpack迁移到Jetpack Compose。此片段是现有导航图的一部分。 迁移片段(使用ComposeView)进行合成后,片段方向不再可用。 这种情况下你会怎么做?片段是导航图一部分,几个未组合的片段导航到它。 以下是片段的 onCreateView: