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

Flutter Syncfusion Charts报BanditData非List<BanditData>子类型错误

错误原因

这个类型报错的核心是传入barChart()的数据结构和方法内部的遍历逻辑完全不匹配:

  • 折线图是多系列图表:getBanditLineData()返回List<List<BanditData>>嵌套列表,外层每一个元素对应一条独立折线,元素本身就是List<BanditData>类型,正好匹配LineSeries的dataSource参数要求,所以循环生成多个系列的逻辑可以正常运行。
  • 单组柱状图是单系列图表:getBanditBarData()返回List<BanditData>单层列表,列表里的每一个元素对应一个柱条(也就是单个BanditData对象),你需要的6个柱条属于同一个BarSeries,不需要循环生成多个系列。你直接照搬折线图的遍历逻辑,循环时把单个BanditData对象赋值给要求List<BanditData>类型的dataSource,自然抛出类型不匹配错误。
    之前尝试给单个对象嵌套List、移除for循环仍然报错,本质是没有理清两种图表的系列结构差异,没有把完整的BanditData列表作为单个系列的数据源传入。
修复方案

只需要核心修改即可正常渲染柱状图:

  1. 重写barChart()方法,去掉无意义的循环,直接将完整的柱状图数据列表作为单个BarSeries的数据源
  2. 补全图表切换逻辑,通过已定义的displayLineChart变量控制渲染折线图还是柱状图
  3. (可选优化)删除initState中多余的getBanditBarData()重复调用,避免不必要的数据库查询

修改后的barChart()方法代码如下:

List<ChartSeries> barChart(List<BanditData> data) {
  return <ChartSeries>[
    BarSeries<BanditData, String>(
      dataSource: data,
      xValueMapper: (BanditData b, _) => removeBanditSuffix(b.name),
      yValueMapper: (BanditData b, _) => b.score,
      animationDuration: 2000
    )
  ];
}

将SfCartesianChart的series参数替换为条件判断,支持两种图表切换:

series: displayLineChart ? lineChart(lineData) : barChart(barData),

修改完成后,柱状图会读取6条BanditData数据,在x轴渲染对应玩家名称的6个柱条,柱高匹配对应分数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:03:13