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

如何在fl_chart的getDrawingHorizontalLine生成的线上添加AVG文本?

解决方案

方案一:利用FlChart原生右侧标题实现(推荐)

通过配置titlesData里的右侧标题,让AVG文本和水平线自动对齐,无需额外布局计算:

return BarChart(
  BarChartData(
    barGroups: graphData,
    alignment: BarChartAlignment.center,
    groupsSpace: isPortrait ? null : 70,
    minY: 0,
    maxY: maxUsage,
    gridData: FlGridData(
      horizontalInterval: average,
      checkToShowHorizontalLine: (value) => value == average,
      drawHorizontalLine: true,
      drawVerticalLine: false,
      getDrawingHorizontalLine: (value) => FlLine(
        color: Colors.white,
        strokeWidth: 1,
        dashArray: [5, 5],
      ),
    ),
    // 配置右侧标题显示AVG
    titlesData: FlTitlesData(
      rightTitles: AxisTitles(
        sideTitles: SideTitles(
          showTitles: true,
          reservedSize: 40, // 预留文本宽度
          getTitlesWidget: (double value, TitleMeta meta) {
            // 仅在AVG值的位置显示文本
            if (value == average) {
              return Text(
                'AVG',
                style: TextStyle(color: Colors.white),
                textAlign: TextAlign.center,
              );
            }
            return const SizedBox.shrink();
          },
        ),
      ),
      // 隐藏其他不需要的标题(按需调整)
      topTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)),
      bottomTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)),
      leftTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)),
    ),
  ),
);

方案二:Stack结合坐标计算(自定义位置用)

如果需要把AVG文本放在线条左侧/中间等自定义位置,可以用Stack包裹图表,通过计算Y轴比例定位文本:

final _chartKey = GlobalKey();

@override
Widget build(BuildContext context) {
  return Stack(
    children: [
      BarChart(
        key: _chartKey,
        BarChartData(
          barGroups: graphData,
          alignment: BarChartAlignment.center,
          groupsSpace: isPortrait ? null : 70,
          minY: 0,
          maxY: maxUsage,
          gridData: FlGridData(
            horizontalInterval: average,
            checkToShowHorizontalLine: (value) => value == average,
            drawHorizontalLine: true,
            drawVerticalLine: false,
            getDrawingHorizontalLine: (value) => FlLine(
              color: Colors.white,
              strokeWidth: 1,
              dashArray: [5, 5],
            ),
          ),
        ),
      ),
      Positioned(
        left: 20, // 自定义左侧偏移量
        top: _getAvgYPosition(),
        child: Text(
          'AVG',
          style: TextStyle(color: Colors.white),
        ),
      ),
    ],
  );
}

double _getAvgYPosition() {
  final renderBox = _chartKey.currentContext?.findRenderObject() as RenderBox?;
  if (renderBox == null) return 0;
  final chartHeight = renderBox.size.height;
  // 计算AVG值在Y轴的比例(FlChart Y轴从下到上是0到maxY)
  final ratio = (maxUsage - average) / (maxUsage - 0);
  return chartHeight * ratio;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:15:36