为什么它说“启动调用应该发生在 LaunchedEffect 内部,而不是组合内部”?

18 android kotlin android-jetpack-compose

我是 jetpack compose 的新手,我尝试构建小项目来学习 jetpack compose,我有示例代码,并且

composableScope.launch 
Run Code Online (Sandbox Code Playgroud)

它会抛出错误,因为调用启动应该发生在 LaunchedEffect 内部,而不是 for 的组合launch,有什么想法吗?

 val composableScope = rememberCoroutineScope()
    val currentPage = onBoardViewModel.currentPage.collectAsState()

Scaffold(
        modifier = Modifier.fillMaxSize(),
        scaffoldState = scaffoldState
    ) {
        Surface(
            modifier = Modifier.fillMaxSize()
        ) {
            composableScope.launch {
                pagerState.animateScrollToPage(
                    page = currentPage.value
                )
            }
}
}
Run Code Online (Sandbox Code Playgroud)

ngl*_*ber 19

您不能直接在“组合”(可组合函数中声明 UI 的位置)中调用协程,因为 Compose 框架可以随时多次调用该函数。

相反,LaunchedEffect如果您想在组合期间调用协程,则应该使用(在此处阅读更多内容)。或者,如果您在事件(例如单击)中需要协程,您应该使用rememberCoroutineScope.

LaunchedEffect(someKey) { // the key define when the block is relaunched
    // Your coroutine code here
}
Run Code Online (Sandbox Code Playgroud)

或者

Modifier.clickable {
    coroutineScope {
        // your coroutine here
    }
}
Run Code Online (Sandbox Code Playgroud)