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

如何在Syncfusion Flutter Chart的ColumnSeries中增加柱形宽度?

问题

尝试自定义Syncfusion Flutter图表的柱形外观,想要增加柱形宽度,但将ColumnSeries的width设为1后,增大该值、调整spacing都无法实现宽柱形效果,希望达到类似参考图的宽柱形样式(仅颜色不同),请问如何正确调整?

当前代码:

import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_charts/charts.dart';

void main() {
  runApp(_ChartApp());
}

class _ChartApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(primarySwatch: Colors.blue),
      home: _MyHomePage(),
    );
  }
}

class _MyHomePage extends StatefulWidget {
  _MyHomePage({Key? key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<_MyHomePage> {
  late TooltipBehavior _tooltip;

  @override
  void initState() {
    super.initState();
    _tooltip = TooltipBehavior(enable: true);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Syncfusion Flutter Chart with Gradient Colors'),
      ),
      body: SfCartesianChart(
        primaryXAxis: CategoryAxis(),
        primaryYAxis: NumericAxis(minimum: 0, maximum: 20, interval: 3),
        margin: EdgeInsets.zero,
        tooltipBehavior: _tooltip,
        series: _buildColumnSeries(),
      ),
    );
  }

  List<ColumnSeries<_ChartData, String>> _buildColumnSeries() {
    final data = [
      _ChartData('Jan', 8, [Color(0xFFFF0000), Color(0x17C1884F)]),
      _ChartData('Feb', 14, [Color(0xFF0000FF), Color(0xD00B5E2)]),
      _ChartData('Mar', 10, [Color(0xFF008000), Color(0x1890EE90)]),
      _ChartData('Apr', 13, [Color(0xFF800080), Color(0x12FFC0CB)]),
      _ChartData('May', 2, [Color(0xFF008080), Color(0x2400FFFF)]),
    ];

    return data.map((entry) {
      return ColumnSeries<_ChartData, String>(
        dataSource: [entry],
        xValueMapper: (_ChartData data, _) => data.x,
        yValueMapper: (_ChartData data, _) => data.y,
        width: 1, // Here I set the width of the bars
        spacing: 0.0,
        gradient: LinearGradient(
          colors: entry.colors,
          begin: Alignment.topCenter,
          end: Alignment.bottomCenter,
        ),
        borderRadius: BorderRadius.circular(12),
      );
    }).toList();
  }
}

class _ChartData {
  final String x;
  final double y;
  final List<Color> colors;

  _ChartData(this.x, this.y, this.colors);
}

解决方案

问题核心是你为每个数据点创建了独立的ColumnSeries,每个系列单独占据X轴分类空间,导致单根柱形只能分到极小宽度,调整width自然无效。正确做法是将所有数据放入同一个ColumnSeries,再通过参数控制宽度。

具体修改步骤:

  1. 合并所有数据到同一个ColumnSeries的dataSource中,不再为每个点创建单独系列
  2. 调整ColumnSeries的width参数(取值范围0-1,值越大柱形越宽)
  3. 用pointColorMapper实现单系列内不同柱形的渐变颜色
  4. 可优化X轴样式,隐藏多余线条提升视觉效果

修改后的完整代码:

import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_charts/charts.dart';

void main() {
  runApp(_ChartApp());
}

class _ChartApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(primarySwatch: Colors.blue),
      home: _MyHomePage(),
    );
  }
}

class _MyHomePage extends StatefulWidget {
  _MyHomePage({Key? key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<_MyHomePage> {
  late TooltipBehavior _tooltip;

  @override
  void initState() {
    super.initState();
    _tooltip = TooltipBehavior(enable: true);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Syncfusion Flutter Chart with Gradient Colors'),
      ),
      body: SfCartesianChart(
        primaryXAxis: CategoryAxis(
          // 隐藏X轴刻度线和网格线,优化宽柱形视觉效果
          majorTickLines: const MajorTickLines(width: 0),
          majorGridLines: const MajorGridLines(width: 0),
        ),
        primaryYAxis: NumericAxis(minimum: 0, maximum: 20, interval: 3),
        margin: EdgeInsets.zero,
        tooltipBehavior: _tooltip,
        series: _buildColumnSeries(),
      ),
    );
  }

  List<ColumnSeries<_ChartData, String>> _buildColumnSeries() {
    final data = [
      _ChartData('Jan', 8, [Color(0xFFFF0000), Color(0x17C1884F)]),
      _ChartData('Feb', 14, [Color(0xFF0000FF), Color(0xD00B5E2)]),
      _ChartData('Mar', 10, [Color(0xFF008000), Color(0x1890EE90)]),
      _ChartData('Apr', 13, [Color(0xFF800080), Color(0x12FFC0CB)]),
      _ChartData('May', 2, [Color(0xFF008080), Color(0x2400FFFF)]),
    ];

    // 仅创建一个ColumnSeries,传入所有数据
    return [
      ColumnSeries<_ChartData, String>(
        dataSource: data,
        xValueMapper: (_ChartData data, _) => data.x,
        yValueMapper: (_ChartData data, _) => data.y,
        // 设置宽度为0.8(占分类空间的80%),可根据需求调整
        width: 0.8,
        spacing: 0.1,
        // 使用pointColorMapper为每个柱形设置独立渐变
        pointColorMapper: (_ChartData data, _) => LinearGradient(
          colors: data.colors,
          begin: Alignment.topCenter,
          end: Alignment.bottomCenter,
        ),
        borderRadius: BorderRadius.circular(12),
      )
    ];
  }
}

class _ChartData {
  final String x;
  final double y;
  final List<Color> colors;

  _ChartData(this.x, this.y, this.colors);
}

关键说明:

  • width参数取值0-1,1表示完全填充分类之间的可用空间
  • spacing控制柱形之间的间距,配合width可调整整体紧凑度
  • pointColorMapper替代多系列方案,实现单系列内不同柱形的差异化样式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 12:29:50