向前导航时如何将底部工作表保留在后退堆栈中?

问题描述 投票:0回答:2

我在我的项目中使用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
顶部)?

android kotlin android-jetpack-compose android-jetpack-navigation jetpack-compose-accompanist
2个回答
6
投票

这是不可能的。根据导航和返回堆栈文档

对话框目标实现

FloatingWindow
接口,表明它们覆盖返回堆栈上的其他目标。因此,一个或多个
FloatingWindow
目的地只能出现在导航返回堆栈的顶部。 导航到未实现
FloatingWindow
的目标会自动将所有
FloatingWindow
目标从堆栈顶部弹出。
这可确保当前目标始终在返回堆栈上的其他目标之上完全可见。

底部工作表目的地也是漂浮在其他目的地之上的

FloatingWindow
目的地。因此,当您导航到其他
dialog
bottomSheet
目的地以外的任何位置时,预计它们会自动从返回堆栈中弹出。


0
投票

我实现了这一目标,实际上并没有将第二个 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 = {})
    }
© www.soinside.com 2019 - 2024. All rights reserved.