renderData method

  1. @override
void renderData(
  1. Canvas canvas,
  2. ChartTransform transform,
  3. PieData pieData
)
override

Implementation

@override
void renderData(
  Canvas canvas,
  ChartTransform transform,
  PieData pieData,
) {

  final layouts = computePies(
    pieData.pies,
    pieData.pieOffset,
    pieData.padAngle,
    pieData.thickness,
    pieData.borderRadius,
    transform
  );

  final paint = Paint();

  for (final layout in layouts) {

    Path pie = layout.toPath();
    pie = transform.path(pie);

    paint.style = PaintingStyle.fill;

    final thickness = pieData.thickness;
    final thicknessGradient = layout.point.thickness?.gradient ?? thickness.gradient;
    if (thicknessGradient != null) {
      paint.shader = thicknessGradient.createShader(pie.getBounds());
    } else {
      paint.shader = null;
      paint.color = layout.point.thickness?.color ?? thickness.color;
    }

    canvas.drawPath(pie, paint);

    final border = layout.point.border?.border ?? pieData.border;
    if (border != null) {
      final borderSize = transform.scalar(border.size);

      final borderLayout = PieSliceData(
        offset: layout.offset,
        innerRadius: max(0, layout.innerRadius - borderSize * border.align),
        outerRadius: layout.outerRadius + borderSize * border.align,
        startAngle: layout.startAngle,
        endAngle: layout.endAngle,
        point: layout.point,
        cornerRadius: layout.cornerRadius,
        padAngle: layout.padAngle
      );

      Path pieBorderPath = borderLayout.toPath();

      paint.style = PaintingStyle.stroke;
      paint.strokeWidth = borderSize;

      if (border.gradient != null) {
        paint.shader = border.gradient!.createShader(pieBorderPath.getBounds());
      } else {
        paint.shader = null;
        paint.color = border.color;
      }

      canvas.drawPath(pieBorderPath, paint);
    }
  }

  // Place each data point at the slice mid-angle on the circle, in Cartesian (x, y).
  var midPoints = pieData.pies.map((point) {
    final cart = toCartesian(point.x, point);
    return point.copyWith(x: cart.dx, y: cart.dy, dy: 0.0);
  }).toList();

  drawDataPoints(canvas, paint, transform, pieData, midPoints);
}