你如何在 Jetpack Compose 中使用 ScrollState?

How do you fling a ScrollState in Jetpack Compose?

出于与 Jetpack Compose input modifiers consuming all MotionEvents 有关的原因,我发现自己为一个 Composable 编写了自己的滚动例程,我可以访问其中的 ScrollState。

我已经想出了我需要的一切,除了投掷。我看不到如何在 ScrollState 上应用 performFling(initialVelocity)。我在文档中所能找到的只有 ScrollState.scrollToScrollState.scrollBy,它们对 flings 不太有用,因为滚动目标或大小未知。

我也找不到 ScrollState 侦听器,类似于旧 Android 世界中的 onScrollStateChanged(state: Int),它会在滚动状态更改时触发。

这是我所拥有的,以防有人能指出我正确的方向:

var lastY: Float? = null
var velocityTracker: VelocityTracker? = null

fun scroll(event: MotionEvent) {
    when (event.action) {
        MotionEvent.ACTION_DOWN -> {
            velocityTracker = VelocityTracker.obtain()
            lastY = event.y
        }
        MotionEvent.ACTION_UP -> {
            lastY = null
            velocityTracker?.let {
                it.computeCurrentVelocity(1000)
                val initialVelocity = it.yVelocity
                velocityTracker?.recycle()
                coroutineScope.launch {
                    ???? scrollState.PERFORMFLING?(initialVelocity) ????
                    AND THEN WHEN THE FLING IS FINISHED viewModel.scrollOffset = scrollState.value
                }
            }
        }
        else -> {
            velocityTracker?.addMovement(event)
            lastY?.let {
                val scrollAmount = it - event.y
                lastY = event.y
                coroutineScope.launch {
                    scrollState.scrollBy(scrollAmount)
                    viewModel.scrollOffset = scrollState.value
                }
            }
        }
    }
}



   

您可以尝试使用 nestedScroll:

 val nestedScrollConnection = remember {
      object : NestedScrollConnection {
            override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
                 return super.onPostFling(consumed, available)
            }

            override suspend fun onPreFling(available: Velocity): Velocity {
                 return super.onPreFling(available)
            }
      }
 }
    
   
Column(modifier = Modifier
      .verticalScroll(rememberScrollState())
      .nestedScroll(nestedScrollConnection)) {

}

如果这不起作用,只需搜索

cs.android.com

对于NestedScrollConnection,它应该会提示您如何处理 Compose 中的投掷。也许 NestedScrollConnection 就是您所需要的,因为它也提供了对滚动的支持。您可能可以放弃您的代码,而只使用 NestedScrollConnection。要查看 NestedScrollConnection 的运行情况,请查看演示:

https://github.com/JohannBlake/Jetmagic