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

Flutter滚动时ListView内Card中fl_chart图表闪烁、内容随机消失问题求助

问题原因

这是滚动触发组件不必要重建+fl_chart重绘逻辑冲突共同导致的:

  1. 滚动时ListView会触发子组件重绘,你每次build都调用calculateValues(items)生成新的data实例,ValuesChart没有唯一标识,Flutter组件diff算法判定为新组件,会销毁旧组件重新创建,就会出现闪烁、内容消失的情况。
  2. fl_chart默认没有独立绘制边界,会跟随父滚动视图的重绘逻辑频繁刷新,也会导致闪烁。

修复步骤

  1. 给ValuesChart加RepaintBoundary和Key,隔离绘制区域,同时让Flutter能正确识别组件:
SizedBox(
  height: 300,
  child: RepaintBoundary(
    child: ValuesChart(
      key: ValueKey(data.hashCode), // 用data的哈希值做唯一标识
      data: data
    ),
  )
)
  1. 缓存计算好的图表数据,不要每次build都调用calculateValues(items):
    如果当前是StatefulWidget,把数据计算放到initState或者didUpdateDependencies里,用变量存起来,build的时候直接用缓存好的数据。
  2. 把buildChartBox改成独立的StatelessWidget,不要用普通方法构建组件,加const构造减少不必要重建:
class ChartBox extends StatelessWidget {
  final Map<String, int> chartData;
  const ChartBox({super.key, required this.chartData});

  @override
  Widget build(BuildContext context) {
    return Expanded(
      child: Card(
        child: Padding(
          padding: const EdgeInsets.all(20.0),
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              chartTitles(title: 'Items', subtitle: 'by value'),
              SizedBox(
                height: 300,
                child: RepaintBoundary(
                  child: ValuesChart(
                    key: ValueKey(chartData.hashCode),
                    data: chartData,
                  ),
                )
              )
            ],
          ),
        ),
      ),
    );
  }
}
  1. 要是还有轻微闪烁,给PieChart的swapAnimationDuration参数设为Duration.zero,禁用切换动画避免滚动时误触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 16:15:05