如何检查是否可组合是在顶部的背面堆栈或不是?



我有一个包含HomeScreenMyBottomSheet的导航图。对于底页,我使用伴奏导航。两个目的地共享一个公共ViewModel,该ViewModel的作用域限定在该导航图中。从该ViewModel中,我暴露了Flow<MyEvent>,其中MyEvent是:

sealed interface MyEvent
object MyEvent1: MyEvent
object MyEvent2: MyEvent

这两个可组合对象是这样的:

@Composable
fun HomeScreen(viewModel: MyViewModel) {
LaunchedEffect(Unit) {
viewModel.eventsFlow.collect {
if(it is Event1) {
handleEvent1()
}
}
}
...
}
@Composable
fun MyBottomSheet(viewModel: MyViewModel) {
LaunchedEffect(Unit) {
viewModel.eventsFlow.collect {
if(it is Event2) {
handleEvent2()
}
}
}
...
}

请注意,我希望HomeScreen处理Event1MyBottomSheet处理Event2(这些事件基本上是导航事件)。

问题是,当MyBottomSheet可见时,两个可组合对象同时收集流,因此Event2也被HomeScreen收集。我想要的是,当MyBottomSheet是最顶层的目的地在后退堆栈,HomeScreen不应该收集流。在我看来,一个可能的解决方案是:

@Composable
fun HomeScreen(viewModel: MyViewModel) {
LaunchedEffect(isHomeScreenOnTheTopOfBackStack) {
if(isHomeScreenOnTheTopOfBackStack) {
viewModel.eventsFlow.collect {
if(it is Event1) {
handleEvent1()
}
}
}
}
...
}

现在在这里,我如何检查HomeScreen是否在back stack的顶部?

或者有没有更好的方法来解决这个问题?

结果很简单。我们可以在导航图中使用navController.currentBackStackEntryAsState(),并将布尔值传递给HomeScreen

composable("home") {
val isOnTop = navController.currentBackStackEntryAsState().value?.destination?.route == "home"
HomeScreen(
viewModel = //,
isHomeScreenOnTheTopOfBackStack = isOnTop
)
}