![](/img/trans.png)
[英]Jetpack Compose + Navigation - Nested navigation with BottomNavBar
[英]Jetpack Compose nested navigation and BottomAppBar
我正在尝试使用 Jetpack 组合导航,但我在理解嵌套导航和布局脚手架方面遇到了问题。
我有一个这样的应用程序屏幕结构
root
├─ A
├─ B <- Had a bottom navigation bar
│ ├─ C
│ ├─ D
这是粗略的规格
我一直在查看文档和 StackOverflow,据我所知,最好将脚手架放在 NavHost 之外。
但是,对于我的情况,如果我无法访问 A 和 B 中的脚手架,我该如何更新 A 和 B 中的应用程序栏? 我只能想像下面的代码那样在脚手架中做一个分支
Scaffold(
scaffoldState = scaffoldState,
topBar = {
when {
currentDestination?.parent?.route == "Home" -> {
TopAppBar(
title = {
Text("Home")
},
)
}
currentDestination?.route == "Other screen" -> {
....
}
我还需要 A 中的访问脚手架 state。
那么解决此类问题的最佳方法是什么?
我在使用NavHost
和使用 multi Scaffold
进行嵌套导航时遇到了这个问题。
这是我的第一个解决方案:
根目录有自己的NavHost
,其中包含 2 个独立的页面(A 和 B),这些页面有自己的功能。
如果我们认为页面 A 是一种类似于启动画面的单页,我们有一个基本的Scaffold
组件。
如果我们认为页面 B 是一种带有底部导航的多页面,例如 Instagram,那么在顶层我们应该为自己的页面创建一个NavHost
。
这是我们的根源:
sealed class RouteScreen(val route: String) {
object A : RouteScreen("a")
object B : RouteScreen("b")
}
@Composable
internal fun RootNavigation(
modifier: Modifier = Modifier,
appState: MultiNavigationAppState
) {
NavHost(
navController = appState.navController,
startDestination = RouteScreen.A.route,
modifier = modifier
) {
addA(appState)
addB(appState)
}
}
private fun NavGraphBuilder.addA(
appState: MultiNavigationAppState
) {
composable(route = RouteScreen.A.route) {
AScreen()
}
}
private fun NavGraphBuilder.addB(
appState: MultiNavigationAppState
) {
composable(route = RouteScreen.B.route) {
BScreen(appState)
}
}
AScreen
是一个可组合项,您可以在其中使用Scaffold
。
BScreen
与AScreen
相同,但您可以为控制选项卡创建另一个NavHost
。
@Composable
fun BScreen(
appState: MultiNavigationAppState
) {
val mainState = rememberMainState()
Scaffold(
bottomBar = {...}
) {
BNavigation(...)
}
}
实际上,不建议使用一个带有嵌套导航的NavHost
,因为如果页面有选项卡及其功能(如 Instagram),我们就会遇到麻烦。
第二种解决方案是我们可以将多fragment
与自己的NavHost, but it's not all based on
Composable 组件。
正如你提到的,我遇到了这个问题,你可以通过这个 Github 项目获得更多帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.