Android 如何使用Jetpack Compose导航处理弹出多个屏幕
我将尝试做一些ASCII艺术来描述这个问题:Android 如何使用Jetpack Compose导航处理弹出多个屏幕,android,android-jetpack-compose,android-jetpack-navigation,Android,Android Jetpack Compose,Android Jetpack Navigation,我将尝试做一些ASCII艺术来描述这个问题: <--------------------------------------\ DestinationA --> DestinationC ---------> DestinationE DestinationB ------/ \-----> DestinationD --/ NavHost当前的用途是: val navController=rememberNavController() 导航主机(n
<--------------------------------------\
DestinationA --> DestinationC ---------> DestinationE
DestinationB ------/ \-----> DestinationD --/
NavHost当前的用途是:
val navController=rememberNavController()
导航主机(navController=navController,startDestination=“DestinationA”){
撰写(“目的地”){
ScreenA(hiltNavGraphViewModel(it))
}
撰写(“目的地B”){
屏幕B(hiltNavGraphViewModel(it))
}
组合(“DestinationC/{id}”,参数=listOf(navArgument(“id”){type=NavType.StringType})){
val viewModel=hiltNavGraphViewModel(it)
val id=it.arguments?.getString(“id”)
viewModel.setId(id)
ScreenC(视图模型)
}
组合(“DestinationD/{id}”,参数=listOf(navArgument(“id”){type=NavType.StringType})){
val viewModel=hiltNavGraphViewModel(it)
val id=it.arguments?.getString(“id”)
viewModel.setId(id)
ScreenD(视图模型)
}
组合(“DestinationE/{id}”,参数=listOf(navArgument(“id”){type=NavType.StringType})){
val viewModel=hiltNavGraphViewModel(it)
val id=it.arguments?.getString(“id”)
viewModel.setId(id)
屏幕(视图模型)
}
}
使用嵌套的导航图在不同的导航上创建DestinationC
和destinationone
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "DestinationA") {
compose("DestinationA") {
ScreenA(hiltNavGraphViewModel(it))
}
compose("DestinationB") {
ScreenB(hiltNavGraphViewModel(it))
}
navigation("DestinationC".plus("/{id}"), "DestinationC".plus("_Route")) {
compose("DestinationC/{id}", arguments = listOf(navArgument("id") { type = NavType.StringType })) {
val viewModel = hiltNavGraphViewModel(it)
val id = it.arguments?.getString("id")
viewModel.setId(id)
ScreenC(ViewModel)
}
}
compose("DestinationD/{id}", arguments = listOf(navArgument("id") { type = NavType.StringType })) {
val viewModel = hiltNavGraphViewModel(it)
val id = it.arguments?.getString("id")
viewModel.setId(id)
ScreenD(viewModel)
}
navigation("DestinationE".plus("/{id}"), "DestinationE".plus("_Route")) {
compose("DestinationE/{id}", arguments = listOf(navArgument("id") { type = NavType.StringType })) {
val viewModel = hiltNavGraphViewModel(it)
val id = it.arguments?.getString("id")
viewModel.setId(id)
ScreenE(ViewModel)
}
}
}
例如,您希望从C移动到E,并弹出到A
navController.navigate("DestinationE".plus("/${data.id}")) {
popUpTo("DestinationA") {
inclusive = false
}
}
DestinationA
和DestinationB
应该是两个不同的startDestination
?如果是的话,那么在导航、标签或其他方面使用了什么组件?我承认我对导航的理解不是很深入。也许DestinationA
和DestinationB
应该不同startDestination
,但它们不是。我有一个平面的NavHost
,其中包含所有目的地,DestinationA
是startdestation
。我用的是导航抽屉。这是否改变了我应该如何设计导航?如果是,怎么做?谢谢。你可以发布你当前的导航图吗?SS也会帮助你。DestinationA
和DestinationB
属于哪里?它们是抽屉的方向项目吗?是的,DestinationA和DestinationB是抽屉中的顶级目的地。导航图完全没有意思。我将编辑这个问题,使其格式合理。你能解释一下吗?导航代码会是什么样子?@Sean我已经介绍了如何从DestinationOne导航,我想跳回A或B,以堆栈上的哪个为准。我不想在导航到DestinationOne时将DestinationC从堆栈中弹出,因为您应该仍然能够从E导航回C。Popup到DestinationA它将跳过DestinationA如果DestinationA不在Backback上怎么办?这不能保证。这就是我的观点。