导航组件版本2.4.0-alpha06
我有一个使用Scaffold
的导航抽屉,其中一部分项目是由ViewModel动态生成的。
示例项目包括:
- Home
- A
- B
- C ...
- Settings
其中A、B、C等都共享同一个名为Category
的Screen
,只是传递的参数不同(例如,Category/A,Category/B)。
在我的Scaffold
内部
...
val items = viewModel.getDrawerItems()
// This gives something like
// ["Home", "Category/A", "Category/B", "Category/C", ..., "Settings"]
// where each String represents "route"
...
val backstackEntry = navController.currentBackStackEntryAsState()
val currentScreen = Screen.fromRoute(
backstackEntry.value?.destination?.route
)
Log.d("Drawer", "currentScreen: $currentScreen")
items.forEach { item ->
DrawerItem(
item = item,
isSelected = currentScreen.name == item.route,
onItemClick = {
Log.d("Drawer", "destinationRoute: ${item.route}")
navController.navigate(item.route)
scope.launch {
scaffoldState.drawerState.close()
}
}
)
}
这段代码运行得相当不错,但是当我访问首页时,我想要清除除了首页以外的所有返回栈。
我尝试添加 NavOptionsBuilder。
...
navController.navigate(item.route) {
popUpTo(currentScreen.name) {
inclusive = true
saveState = true
}
}
...
然而,这样做不起作用,因为
currentScreen.name
会给出类似于Category/{title}
的内容,而popUpTo只尝试从后台查找精确匹配项,因此它不会弹出任何内容。
是否有真正的Compose导航方法来解决这个问题?或者我应该在ViewModel中保存最后一个"title"并使用它?
Google的这个教程具有类似的结构,但它只是堆叠屏幕,因此从屏幕A返回到B->A并单击返回将返回到B->A,这对我来说不是理想的行为。提前致谢。
saveState
解决了问题 :),现在我只有一个简单的按钮和一个文本,但是以后我想添加LazyColumn
来显示项目列表。如果我设置saveState = false
,它不会记住所有状态并且滚动位置将在重新组合时重置吗?谢谢! - Saehun Sean OhsaveState = false
会丢弃你从后退栈中移除的视图,因此滚动位置将会丢失。但是你当前的视图不会丢失任何东西。如果不替换popUpTo
目标,它是否能正常工作? - Phil Dukhov