我在我的项目中使用Accompanist Bottom Sheet Destinations。设置与文档中显示的完全相同。
@Composable
fun MyApp() {
val bottomSheetNavigator = rememberBottomSheetNavigator()
val navController = rememberNavController(bottomSheetNavigator)
ModalBottomSheetLayout(bottomSheetNavigator) {
NavHost(navController, Destinations.Home) {
composable(route = "home") {
HomeScreen(
openBottomSheet = { navController.navigate("sheet") }
)
}
bottomSheet(route = "sheet") {
MyBottonSheet(
navigateToSomeRoute = { navController.navigate("some_route") }
)
}
composable(route = "some_route") {
SomeComposable(
onBackPress = { navController.navigateUp() }
)
}
}
}
}
这里
MyBottomSheet
中有一个按钮,可以打开 SomeComposable
屏幕。但是当我从那里向上导航时,我到达HomeScreen
,即当我导航离开它时,底部工作表从后堆栈中弹出。如何将底部工作表保留在后堆栈中,以便当我按 SomeComposable
中的“返回”时,我可以返回到 MyBottonSheet
打开时的上一个状态(位于 HomeScreen
顶部)?
这是不可能的。根据导航和返回堆栈文档:
接口,表明它们覆盖返回堆栈上的其他目标。因此,一个或多个FloatingWindow
目的地只能出现在导航返回堆栈的顶部。 导航到未实现FloatingWindow
的目标会自动将所有FloatingWindow
目标从堆栈顶部弹出。 这可确保当前目标始终在返回堆栈上的其他目标之上完全可见。FloatingWindow
底部工作表目的地也是漂浮在其他目的地之上的
FloatingWindow
目的地。因此,当您导航到其他 dialog
或 bottomSheet
目的地以外的任何位置时,预计它们会自动从返回堆栈中弹出。
我实现了这一目标,实际上并没有将第二个 BottomSheet 设为 NavHost 的目的地,而是将其设为常规 BottomSheet。之后我意识到,使用这种方式,一切都像魅力一样,除了一件事,那就是第一个 BottomSheet 不被隐藏,而第二个 BottomSheet 显示。然后我确实在 Google 自己的任务应用程序中测试了类似的行为(我在第一个答案的评论中提到过),结果发现这也是确切的行为。这就是 Google 开发人员所做的,这就是要走的路。
这是我在第一个 BottomSheet 目标中的代码:
var isSecondSheetVisible by rememberSaveble { mutableStateOf(false) }
Button(
// onClick = navigateToSelectListScreen,
onClick = { isSecondSheetVisible = true },
text = {...}
)
if (isSelectTaskSheetVisible) ModalBottomSheet(
onDismissRequest = {
isSelectTaskSheetVisible = false
}) {
SelectTaskListBottomSheet(popBackStack = {})
}