在Jetpack Compose中替换GlobalScope.launch。

6

我正在使用Jetpack Compose编写一些页面代码,在某些情况下需要通过按钮点击更改页面编号。这是我的按钮点击事件:

onClick = {pagerState.scrollToPage(page=currentPager+1)}

但是当我这样做时,出现了以下错误:Suspend function 'scrollToPage' should be called only from a coroutine or another suspend function

我通过添加以下内容解决了这个问题:

onClick = {GlobalScope.launch (Dispatchers.Main) {pagerState.scrollToPage(page=currentPager+1)}}

但是仍然不建议使用GlobalScope.launch。上述的onClick方法都是在基本的Compose函数中调用的。如何在Jetpack Compose中解决这个问题?


你正在使用哪个Compose小部件来进行分页? - DeePanShu
我正在使用accompanist pager。-> com.google.accompanist:accompanist-pager:0.20.2 - Ankit Shah
2个回答

11

请查阅此文档:Accompanist Pager

这是一段原始代码:滚动到页面的原始代码

如果您想跳转到特定页面,则可以在CoroutineScope中调用pagerState.scrollToPage(index)或pagerState.animateScrollToPage(index)方法:

val pagerState = rememberPagerState()
val scope = rememberCoroutineScope()

HorizontalPager(count = 10, state = pagerState) { page ->
    // ...page content
}

// Later, scroll to page 2
scope.launch {
    pagerState.scrollToPage(2)
}

我从这个答案和上面的回答中找到了一个解决方案。我进行了编辑,以展示作用域是如何定义的。这个方法有效。 - Ankit Shah
太好了,兄弟。 - DeePanShu

7

您应该使用下面的代码在您的组合界面中创建协程作用域。

val coroutinesScope = rememberCoroutineScope()

请注意,您只能在可组合项中调用此函数,因此您不能在 onClick() 中创建 coroutineScope,而必须在可组合项的顶部进行初始化。

这完美地定义了协程作用域的定义和投票方式,但完整的解决方案在上面的答案中展示,因此请打勾。谢谢。 - Ankit Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接