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

JetPack中圆形进度条问题:需等待PagerContent加载完成再隐藏

解决Compose中进度条需等待PagerContent加载完成再消失的问题

你的问题出在当前代码只判断API数据是否返回,就立刻切换到Pager组件,但PagerContent内部可能有耗时的加载操作(比如图片加载、复杂UI渲染),导致数据回来后页面卡顿,进度条却提前消失了。要让进度条等PagerContent完全加载好再隐藏,可以按下面的方式修改:

1. 改用独立的加载状态变量

把之前注释掉的isLoading变量启用,用它来控制进度条的显示,而不是直接判断selected是否为空。

2. 让PagerContent通知父组件加载完成

给PagerContent加一个回调参数,当它内部的耗时操作完成后,告诉父组件“我加载完了”。

3. 调整加载状态的更新逻辑

API请求完成后先不关闭加载,等当前显示的PagerContent加载完成后,再把isLoading设为false。

修改后的完整代码

fun Preview(Number: String) {
    var selected by remember { mutableStateOf<Train?>(null) }
    var isLoading by remember { mutableStateOf(true) }
    // 记录已经加载完成的页面索引,避免重复触发
    val loadedPages = remember { mutableSetOf<Int>() }

    LaunchedEffect(key1 = Unit) {
        // 模拟API请求延迟
        delay(1000)
        selected = data from API
    }

    // 监听选中数据和当前页面变化,判断是否可以关闭加载状态
    LaunchedEffect(selected, pagerState.currentPage) {
        if (selected != null && loadedPages.contains(pagerState.currentPage)) {
            isLoading = false
        }
    }

    if (isLoading) {
        Column(
            Modifier.fillMaxSize(),
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            CircularProgressIndicator(color = Color.Blue)
            Spacer(modifier = Modifier.height(10.dp))
            Text(text = "Loading Please Wait...")
        }
    } else {
        selected?.let { trainData ->
            HorizontalPager(
                state = pagerState,
                modifier = Modifier.fillMaxSize(),
                beyondBoundsPageCount = 2
            ) { index ->
                PagerContent(trainData[index]) {
                    // 标记当前页面已加载完成
                    loadedPages.add(index)
                }
            }
        }
    }
}

对应的PagerContent修改示例

如果PagerContent里有图片加载(以Coil为例),可以在图片加载完成后触发回调;如果是纯UI布局,用LaunchedEffect在组合完成后通知父组件:

@Composable
fun PagerContent(train: Train, onLoaded: () -> Unit) {
    Column(modifier = Modifier.fillMaxSize()) {
        // 示例:图片加载完成后触发回调
        AsyncImage(
            model = train.imageUrl,
            contentDescription = "Train Image",
            modifier = Modifier.fillMaxWidth().height(200.dp),
            onSuccess = {
                onLoaded()
            }
        )

        // 其他页面内容
        Text(text = "车次:${train.number}")
        Text(text = "名称:${train.name}")

        // 如果没有异步加载,纯UI布局的话,用这个LaunchedEffect在组件组合完成后触发
        // LaunchedEffect(Unit) {
        //     onLoaded()
        // }
    }
}

额外说明

  • 如果你需要等待所有预加载的页面(因为设置了beyondBoundsPageCount=2)都加载完成再隐藏进度条,可以修改逻辑,判断loadedPages的数量是否等于总页面数
  • 如果PagerContent有多个异步操作(比如同时加载图片和接口数据),可以在内部用多个状态变量跟踪,等所有操作都完成后再调用onLoaded

内容的提问来源于stack exchange,提问作者Pawandeep Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:37:34