Jetpack Compose 使用 CoroutineScope 滚动 LazyColumn 结果错误 A MonotonicFrameClock 在此 CoroutineContext 中不可用

时间:2021-07-15 17:07:34

标签: android kotlin-coroutines android-jetpack-compose

检查 this example 和列表以使用状态和协程作为滚动

@Composable
fun ScrollingList() {
    val listSize = 100
    // We save the scrolling position with this state
    val scrollState = rememberLazyListState()
    // We save the coroutine scope where our animated scroll will be executed
    val coroutineScope = rememberCoroutineScope()

    Column {
        Row {
            Button(onClick = {
                coroutineScope.launch {
                    // 0 is the first item index
                    scrollState.animateScrollToItem(0)
                }
            }) {
                Text("Scroll to the top")
            }

            Button(onClick = {
                coroutineScope.launch {
                    // listSize - 1 is the last index of the list
                    scrollState.animateScrollToItem(listSize - 1)
                }
            }) {
                Text("Scroll to the end")
            }
        }

        LazyColumn(state = scrollState) {
            items(listSize) {
                ImageListItem(it)
            }
        }
    }
}

哪个适用于挂起函数

suspend fun animateScrollToItem(
    /*@IntRange(from = 0)*/
    index: Int,
    /*@IntRange(from = 0)*/
    scrollOffset: Int = 0
) {
    doSmoothScrollToItem(index, scrollOffset)
}

如果我将协程范围更改为

val coroutineScope = CoroutineScope(Dispatchers.Main)

它回来了

<块引用>

java.lang.IllegalStateException: A MonotonicFrameClock 不是 在此 CoroutineContext 中可用。来电者应提供 使用 withContext 适当的 MonotonicFrameClock。

这是什么意思,是 rememberCoroutineScope() 向该函数提供 coroutineScope 的唯一方法吗?

1 个答案:

答案 0 :(得分:0)

由于 animateScrollToItem 是可组合函数,因此需要在 Composition 范围内调用。

As documentation states

<块引用>

rememberCoroutineScope 是一个可组合的函数,它返回一个 CoroutineScope 绑定到它被调用的组合点。当调用离开 Composition 时,范围将被取消。