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

Jetpack Compose环形图表不更新数据该如何解决?

问题分析与解决方案

核心疑问解答

普通List作为Composable参数不会导致仅首次渲染。Composable会在参数的引用发生变化时自动触发重组,你每次通过listOf()生成的新列表都是不同的实例,满足参数变化的触发条件。图表不更新的问题,根源不在List类型本身,而是代码写法或DonutChart组件的内部实现问题。

当前代码的问题

你在showChartSection中额外使用mutableStateOf保存图表数据的写法存在冗余,虽然逻辑上能更新状态,但增加了不必要的状态维护步骤,且可能因状态更新时机的问题导致图表未正确响应。

代码优化方案

直接基于monthComparison参数推导图表数据,去掉冗余的状态变量,让DonutChart直接依赖源参数的变化:

@Composable
fun showChartSection(monthComparison: MonthComparison?) {
    showSubTitles(text = stringResource(id = R.string.MonthlyCompare))
    Column(
        modifier = Modifier
            .fillMaxWidth()
            .padding(top = 10.dp),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        showParagraphText(text = stringResource(id = R.string.MonthComparisonByTrip))
        Box(
            modifier = Modifier
                .size(180.dp)
                .padding(top = 5.dp)
        ) {
            // 直接根据monthComparison生成图表数据
            val donutChartData = monthComparison?.let {
                listOf(
                    DonutData(it.currentMonthTripCount.toFloat(), secondarycolor),
                    DonutData(it.pastMonthTripCount.toFloat(), primarycolor)
                )
            } ?: listOf(DonutData(360f, secondarycolor))
            
            DonutChart(
                modifier = Modifier.align(Alignment.Center),
                data = donutChartData
            )
        }
    }
}

若优化后仍不更新的排查方向

如果修改后图表还是没有响应数据变化,问题出在DonutChart组件的内部实现,需要检查以下几点:

  • 组件内部是否用remember缓存了data参数,导致新数据无法触发重绘;
  • 图表的绘制逻辑(如Canvas绘制)是否依赖了未更新的缓存状态,没有根据新data重新计算绘制数据;
  • 确保DonutChart的所有与数据相关的绘制逻辑,都直接依赖传入的data参数,而非内部缓存的旧值。

内容的提问来源于stack exchange,提问作者Gellért Hováth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 20:00:26