kotlin Jetpack使用Navigation编写CoroutineScope

jogvjijk  于 2023-08-06  发布在  Kotlin
关注(0)|答案(1)|浏览(153)

我找了很多,但找不到答案。我有一个ModalNavigationDrawer和3个不同的屏幕与TopAppBar。在实现Drawer的MainComposable()中,我示例化了Drawerstate和一个CoroutineScope,如下所示:

@Composable
fun MainCompose() {

val navController = rememberNavController()
val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed)
val scope = rememberCoroutineScope()

字符串

drawerstate被向下传递到Drawer和Screen1、Screen2和Screen3。并且scope被传递到所有不同的屏幕。默认情况下,当应用程序打开时,我说当用户单击TopAppBar的汉堡图标时,NaVDrawer应该打开:

IconButton(onClick = { coroutineScope.launch { drawerState.open() }})


然后,用户从抽屉中选择一个目标,并单击NavDrawer中的一个项目。点击时,我说抽屉应关闭:

scope.launch { drawerState.close() }


现在我的问题是,为什么在CoroutineScope内部的协程之间没有冲突?如果我从默认导航到屏幕2,则会发生以下情况:
Screen1中的coroutine1被取消,因为DefaultScreen的composable离开了composition。
MainActivity中的coroutine2仍在运行,因为单击NavDrawerstill的图标,其值为Drawer.Closed。当用户现在点击屏幕2中TopAppBar的HamburgerButton时,coroutine3以值Drawer.Open开始。

zfciruhq

zfciruhq1#

@Jorn好吧,也许我忘记了drawerstate.close()是一个函数,当函数完成任务时,协程作业是不活动的。我误解了这个概念,认为协程始终保持DrawerState的值。

相关问题