draw method
Implementation
@override
void draw(Canvas canvas, Size size, ChartContext context) {
final series = context.config.series.isNotEmpty
? context.config.series.first
: null;
if (series == null || series.points.isEmpty) return;
final anim = context.animationValue;
final art = SeriesPaint(context.config.style);
final total = series.points.fold<double>(0, (s, p) => s + p.y.abs());
if (total == 0) return;
final center = context.bounds.center;
final radius =
math.min(context.bounds.width, context.bounds.height) / 2 * 0.85;
final innerRadius = isDonut ? radius * donutRadiusFactor : 0.0;
if (context.config.showGrid) {
final gridPaint = context.paintCache.get(
key: 'pie-grid',
color: context.theme.gridColor,
strokeWidth: context.theme.gridStrokeWidth,
);
for (var i = 1; i <= 4; i++) {
canvas.drawCircle(center, radius * i / 4, gridPaint);
}
}
var startAngle = -math.pi / 2;
for (var i = 0; i < series.points.length; i++) {
final point = series.points[i];
final sweep = (point.y.abs() / total) * 2 * math.pi * anim;
final color = _sliceColor(context, series, point, i);
var sliceCenter = center;
if (explodedIndex == i) {
final mid = startAngle + sweep / 2;
sliceCenter =
center +
Offset(
math.cos(mid) * explodeDistance,
math.sin(mid) * explodeDistance,
);
}
final rect = Rect.fromCircle(center: sliceCenter, radius: radius);
final paint = art.blobFill(rect, color);
if (isDonut) {
final path = Path()
..addArc(rect, startAngle, sweep)
..arcTo(
Rect.fromCircle(center: sliceCenter, radius: innerRadius),
startAngle + sweep,
-sweep,
false,
)
..close();
canvas.drawPath(path, paint);
} else {
canvas.drawArc(rect, startAngle, sweep, true, paint);
}
if (context.hoveredHit?.pointIndex == i) {
canvas.drawArc(
rect,
startAngle,
sweep,
true,
context.paintCache.get(
key: 'pie-hover',
color: Colors.white.withValues(alpha: 0.25),
strokeWidth: 2,
),
);
}
startAngle += sweep;
}
_drawSliceBorders(
canvas,
context,
center,
radius,
innerRadius,
series.points,
total,
anim,
);
if (isDonut) {
_drawCenterLabel(canvas, context, series);
}
if (context.config.showAxis) {
_drawSliceLabels(canvas, context, series, center, radius, total, anim);
}
AxisEngine.drawAxisTitles(canvas, context);
}