检查 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 的唯一方法吗?
答案 0 :(得分:0)
由于 animateScrollToItem 是可组合函数,因此需要在 Composition 范围内调用。
<块引用>rememberCoroutineScope 是一个可组合的函数,它返回一个 CoroutineScope 绑定到它被调用的组合点。当调用离开 Composition 时,范围将被取消。