drawAxisLabels method
void
drawAxisLabels()
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),
);
}
}
}
}