paint method

  1. @override
void paint(
  1. BuildContext context,
  2. CanvasWrapper canvasWrapper,
  3. PaintHolder<LineChartData> holder
)
override

Paints LineChartData into the provided canvas.

Implementation

@override
void paint(
  BuildContext context,
  CanvasWrapper canvasWrapper,
  PaintHolder<LineChartData> holder,
) {
  final data = holder.data;
  if (data.lineBarsData.isEmpty) {
    return;
  }

  if (data.clipData.any) {
    canvasWrapper.saveLayer(
      Rect.fromLTWH(
        0,
        -40,
        canvasWrapper.size.width + 40,
        canvasWrapper.size.height + 40,
      ),
      Paint(),
    );

    clipToBorder(canvasWrapper, holder);
  }

  super.paint(context, canvasWrapper, holder);

  for (final betweenBarsData in data.betweenBarsData) {
    drawBetweenBarsArea(canvasWrapper, data, betweenBarsData, holder);
  }

  if (!data.extraLinesData.extraLinesOnTop) {
    super.drawExtraLines(context, canvasWrapper, holder);
  }

  final lineIndexDrawingInfo = <LineIndexDrawingInfo>[];

  /// draw each line independently on the chart
  for (var i = 0; i < data.lineBarsData.length; i++) {
    final barData = data.lineBarsData[i];

    if (!barData.show) {
      continue;
    }

    drawBarLine(canvasWrapper, barData, holder);
    drawDots(canvasWrapper, barData, holder);

    if (data.extraLinesData.extraLinesOnTop) {
      super.drawExtraLines(context, canvasWrapper, holder);
    }

    final indicatorsData = data.lineTouchData
        .getTouchedSpotIndicator(barData, barData.showingIndicators);

    if (indicatorsData.length != barData.showingIndicators.length) {
      throw Exception(
        'indicatorsData and touchedSpotOffsets size should be same',
      );
    }

    for (var j = 0; j < barData.showingIndicators.length; j++) {
      final indicatorData = indicatorsData[j];
      final index = barData.showingIndicators[j];
      if (index < 0 || index >= barData.spots.length) {
        continue;
      }
      final spot = barData.spots[index];

      if (indicatorData == null) {
        continue;
      }
      lineIndexDrawingInfo.add(
        LineIndexDrawingInfo(barData, i, spot, index, indicatorData),
      );
    }
  }

  drawTouchedSpotsIndicator(canvasWrapper, lineIndexDrawingInfo, holder);

  if (data.clipData.any) {
    canvasWrapper.restore();
  }

  // Draw touch tooltip on most top spot
  for (var i = 0; i < data.showingTooltipIndicators.length; i++) {
    var tooltipSpots = data.showingTooltipIndicators[i];

    final showingBarSpots = tooltipSpots.showingSpots;
    if (showingBarSpots.isEmpty) {
      continue;
    }
    final barSpots = List<LineBarSpot>.of(showingBarSpots);
    AFlSpot topSpot = barSpots[0];
    for (final barSpot in barSpots) {
      if (barSpot.y > topSpot.y) {
        topSpot = barSpot;
      }
    }
    tooltipSpots = ShowingTooltipIndicators(barSpots);

    drawTouchTooltip(
      context,
      canvasWrapper,
      data.lineTouchData.touchTooltipData,
      topSpot,
      tooltipSpots,
      holder,
    );
  }
}