draw method
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),
);
}
}