draw method

  1. @override
void draw(
  1. Canvas canvas,
  2. Size size,
  3. ChartContext context
)
override

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);
}