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) {
  if (context.config.series.isEmpty) return;
  final series = context.config.series.first;

  final candleWidth =
      context.bounds.width / math.max(series.points.length, 1) * 0.6;

  for (var i = 0; i < series.points.length; i++) {
    final p = series.points[i];
    final open = (p.metadata['open'] as num?)?.toDouble() ?? p.y;
    final high = (p.metadata['high'] as num?)?.toDouble() ?? p.y;
    final low = (p.metadata['low'] as num?)?.toDouble() ?? p.y;
    final close = (p.metadata['close'] as num?)?.toDouble() ?? p.y;

    final x = context.transformer.dataToCanvasX(p.x);
    final bullish = close >= open;
    const bullColor = Color(0xFF43A047);
    const bearColor = Color(0xFFE53935);
    final color = bullish ? bullColor : bearColor;

    final highY = context.transformer.dataToCanvasY(high);
    final lowY = context.transformer.dataToCanvasY(low);
    final openY = context.transformer.dataToCanvasY(open);
    final closeY = context.transformer.dataToCanvasY(close);

    canvas.drawLine(
      Offset(x, highY),
      Offset(x, lowY),
      context.paintCache.get(key: 'wick', color: color, strokeWidth: 1.5),
    );

    final bodyTop = bullish ? closeY : openY;
    final bodyBottom = bullish ? openY : closeY;
    final bodyRect = Rect.fromCenter(
      center: Offset(x, (bodyTop + bodyBottom) / 2),
      width: candleWidth,
      height: (bodyBottom - bodyTop).abs().clamp(1, double.infinity),
    );
    drawRoundedBar(
      canvas,
      bodyRect,
      radius: context.config.barBorderRadius,
      paint: context.paintCache.fill('body-$i', color),
    );
  }
}