如何在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
相关产品推荐
相关产品推荐

