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

Android应用下拉刷新图标不显示问题求助

问题修复方案

你的代码核心问题是Composable的渲染顺序导致下拉刷新容器被覆盖:当前Box(包含PullToRefreshContainer)和when代码块是并列的Composable,Compose会按顺序绘制,后面的when块内容会完全覆盖前面的Box,所以下拉图标被挡住了。

具体修复步骤:

1. 调整布局结构,将主内容移入Box内部

把when代码块的内容放到Box里面,让PullToRefreshContainer叠加在主内容上方:

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun StatsScreen(
    statsUiState: StatsUiState,
    statsViewModel: StatsViewModel,
    modifier: Modifier = Modifier
) {
    val state = rememberPullToRefreshState()

    // 优化刷新逻辑:用state.isRefreshing作为LaunchedEffect的key,避免重复执行
    LaunchedEffect(state.isRefreshing) {
        if (state.isRefreshing) {
            statsViewModel.getDrivingSkillScore()
            delay(1000)
            state.endRefresh()
        }
    }

    Box(modifier.nestedScroll(state.nestedScrollConnection)) {
        // 主内容移到Box内部,替换原来空的LazyColumn
        when (statsUiState) {
            is StatsUiState.Success -> ResultScreen(
                scores = statsUiState.score,
                modifier = modifier.fillMaxSize()
            )

            is StatsUiState.Loading -> LoadingScreen(modifier = modifier.fillMaxSize())
            is StatsUiState.Error -> ErrorScreen(modifier = modifier.fillMaxSize())
        }

        PullToRefreshContainer(
            modifier = Modifier.align(Alignment.TopCenter),
            state = state,
        )
    }
}

2. 让主内容支持滚动(可选但推荐)

如果你的统计内容较多,需要滚动查看,把ResultScreen里的Column替换成LazyColumn,这样嵌套滚动能和下拉刷新更好配合:

@Composable
fun ResultScreen(
    scores: List<DrivingSkillScore>,
    modifier: Modifier = Modifier
) {
    LazyColumn(
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = modifier
    ) {
        item {
            Text(
                text = "Current Driving Skill Level",
                color = NavActiveColor,
                fontSize = 20.sp,
                modifier = Modifier
                    .padding(16.dp)
                    .align(AbsoluteAlignment.Left)
            )
        }
        item {
            CurrentSkillChart(scores.last())
        }
        item {
            Text(
                text = "Last Performance Level",
                color = NavActiveColor,
                fontSize = 20.sp,
                modifier = Modifier
                    .padding(16.dp)
                    .align(AbsoluteAlignment.Left)
            )
        }
        item {
            LastPerformanceChart(scores.takeLast(5))
        }
    }
}

额外优化点:

  • 原来的LaunchedEffect(true)会在每次重组时重复执行,改成以state.isRefreshing为key,只有当刷新状态变化时才触发逻辑,避免无效执行。
  • 给主内容的modifier加上fillMaxSize(),确保它占满整个Box区域,这样下拉手势能在整个屏幕范围内生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 09:53:18