drawAxisLabels method

void drawAxisLabels(
  1. Canvas canvas,
  2. Size size,
  3. double minX,
  4. double maxX,
  5. double minY,
  6. double maxY,
)

Draw axis labels (optimized with text style caching)

Implementation

void drawAxisLabels(
  Canvas canvas,
  Size size,
  double minX,
  double maxX,
  double minY,
  double maxY,
) {
  if (!showLabel || !showAxis || !theme.showAxis) return;

  // Validate size and ranges
  if (size.width <= 0 || size.height <= 0) return;
  if (!size.width.isFinite || !size.height.isFinite) return;

  final xRange = maxX - minX;
  final yRange = maxY - minY;

  // Validate ranges are valid and non-zero
  if (!xRange.isFinite || !yRange.isFinite) return;

  // Cache text style
  final textStyle = TextStyle(
    color: theme.axisColor.withValues(alpha: 0.8),
    fontSize: 11,
    fontWeight: FontWeight.w500,
    letterSpacing: 0.2,
  );

  // X-axis labels - better formatting with pre-calculated values
  final xLabelsCount =
      math.max(1, math.min(6, (xRange > 0 ? xRange : 1).ceil().toInt()));
  if (xLabelsCount > 0 && xRange > 0) {
    final xStep = size.width / xLabelsCount;

    for (int i = 0; i <= xLabelsCount; i++) {
      final x = xStep * i;
      if (!x.isFinite) continue;

      final value = minX + xRange * (i / xLabelsCount);
      if (!value.isFinite) continue;

      final displayValue = value % 1 == 0
          ? value.toInt().toString()
          : value.toStringAsFixed(1);

      final textPainter = TextPainter(
        text: TextSpan(text: displayValue, style: textStyle),
        textDirection: TextDirection.ltr,
      );
      textPainter.layout();

      final offsetX = x - textPainter.width / 2;
      final offsetY = size.height + 8;

      // Validate offset values before painting
      if (offsetX.isFinite && offsetY.isFinite) {
        textPainter.paint(
          canvas,
          Offset(offsetX, offsetY),
        );
      }
    }
  }

  // Y-axis labels - better formatting with pre-calculated values
  const yLabels = 5;
  if (yLabels > 0 && yRange > 0) {
    final yStep = size.height / yLabels;

    for (int i = 0; i <= yLabels; i++) {
      final y = size.height - yStep * i;
      if (!y.isFinite) continue;

      final value = minY + yRange * (i / yLabels);
      if (!value.isFinite) continue;

      final displayValue = value % 1 == 0
          ? value.toInt().toString()
          : value.toStringAsFixed(1);

      final textPainter = TextPainter(
        text: TextSpan(text: displayValue, style: textStyle),
        textDirection: TextDirection.ltr,
      );
      textPainter.layout();

      final offsetX = -textPainter.width - 8;
      final offsetY = y - textPainter.height / 2;

      // Validate offset values before painting
      if (offsetX.isFinite && offsetY.isFinite) {
        textPainter.paint(
          canvas,
          Offset(offsetX, offsetY),
        );
      }
    }
  }
}