You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Compose VerticalPager嵌套可滚动项导致滚动卡顿问题求解

VerticalPager与内部可滚动项的滚动冲突解决方法

针对你使用androidx.compose.foundation:foundation:1.5.0-beta03时,VerticalPager内部可滚动Text出现的滚动不流畅问题,提供以下两种解决思路:

方法一:完全禁用内部组件的嵌套滚动

通过自定义NestedScrollConnection,让内部可滚动组件消费所有垂直滚动事件,不再传递给父级VerticalPager,彻底避免滚动冲突:

@Composable
fun FixedBugSample(text: String) {
    val state = rememberPagerState() { 15 }
    Column {
        VerticalPager(state = state) { page ->
            Column {
                Box(
                    Modifier
                        .fillMaxWidth()
                        .fillMaxHeight(0.7f)
                        .background(Color.White)
                )
                Text(
                    text = text,
                    modifier = Modifier
                        .verticalScroll(rememberScrollState())
                        .nestedScroll(object : NestedScrollConnection {
                            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
                                // 消费全部垂直滚动事件,阻止事件传递给VerticalPager
                                return available
                            }
                        }),
                    color = Color.White
                )
            }
        }
    }
}

方法二:优化滚动事件传递逻辑(保留部分嵌套滚动)

如果你希望在Text滚动到边界时,再让VerticalPager接管滚动,可以调整NestedScrollConnection的逻辑:

@Composable
fun OptimizedBugSample(text: String) {
    val state = rememberPagerState() { 15 }
    val textScrollState = rememberScrollState()
    Column {
        VerticalPager(state = state) { page ->
            Column {
                Box(
                    Modifier
                        .fillMaxWidth()
                        .fillMaxHeight(0.7f)
                        .background(Color.White)
                )
                Text(
                    text = text,
                    modifier = Modifier
                        .verticalScroll(textScrollState)
                        .nestedScroll(object : NestedScrollConnection {
                            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
                                val canScrollUp = textScrollState.canScrollBackward
                                val canScrollDown = textScrollState.canScrollForward
                                return when {
                                    // 向下滚动且Text已到底,交给VerticalPager处理
                                    available.y > 0 && !canScrollDown -> Offset.Zero
                                    // 向上滚动且Text已到顶,交给VerticalPager处理
                                    available.y < 0 && !canScrollUp -> Offset.Zero
                                    // 其他情况由Text自己处理滚动
                                    else -> available
                                }
                            }
                        }),
                    color = Color.White
                )
            }
        }
    }
}

补充说明

如果你的场景不需要内部Text和VerticalPager的嵌套交互,方法一的完全禁用是最直接有效的方案,能让两种滚动操作的过渡完全独立流畅。

内容的提问来源于stack exchange,提问作者Daniil Pozdnyakov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 23:45:13