我有一个包含HomeScreen
和MyBottomSheet
的导航图。对于底页,我使用伴奏导航。两个目的地共享一个公共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
处理Event1
和MyBottomSheet
处理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
)
}