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

Jetpack Compose:保持大文本Text组件的滚动状态

解决Jetpack Compose页面跳转后返回丢失滚动状态的问题

问题场景:在Column可组合项中嵌套Text显示超长字符串并开启垂直滚动,跳转至第二个页面后返回,Text的滚动状态会重置到顶部。

问题原因

当从FirstScreen跳转到SecondScreen时,FirstScreen会被Compose从Composition中移除;返回时FirstScreen会重新创建,此时用remember创建的scrollState会被重新初始化,导致之前的滚动位置丢失。

解决方案

使用rememberSaveable替代remember来保存滚动状态。rememberSaveable会将状态持久化到SavedStateHandle,即使Composable被销毁重建也能恢复状态。

修改FirstScreen中的滚动状态创建代码:

// 替换原来的rememberScrollState()
val scrollState = rememberSaveable { ScrollState(0) }

修改后的完整FirstScreen代码

@Composable
fun FirstScreen() {

    var str by remember {
        mutableStateOf("")
    }

    LaunchedEffect(Unit) {
        str = "First Screen\n\n\n" + (1..1000).toList().joinToString()
    }

    // 使用rememberSaveable保存滚动状态
    val scrollState = rememberSaveable { ScrollState(0) }
    Column(
        modifier = Modifier
            .fillMaxSize()
            .verticalScroll(scrollState)
    ) {
        Text(
            text = str,
            textAlign = TextAlign.Center
        )
    }
}

原理说明

ScrollState本身实现了Saver接口,rememberSaveable会自动利用这个Saver来序列化和反序列化滚动偏移量(scrollOffset)。当FirstScreen重建时,会从SavedState中恢复之前的scrollOffset,从而保持跳转前的滚动位置。

内容的提问来源于stack exchange,提问作者Bugs Happen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:10:31