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.firstOrNull;
  if (series == null || series.points.isEmpty) return;

  final xs = series.points.map((p) => p.x).toSet().toList()..sort();
  final ys = series.points.map((p) => p.y).toSet().toList()..sort();
  final values = <String, double>{};
  var minVal = double.infinity;
  var maxVal = double.negativeInfinity;

  for (final p in series.points) {
    final key = '${p.x}_${p.y}';
    final v = (p.metadata['value'] as num?)?.toDouble() ?? p.y;
    values[key] = v;
    if (v < minVal) minVal = v;
    if (v > maxVal) maxVal = v;
  }

  final cellW = context.bounds.width / xs.length;
  final cellH = context.bounds.height / ys.length;
  final radius = context.config.barBorderRadius;

  for (final p in series.points) {
    final xi = xs.indexOf(p.x);
    final yi = ys.indexOf(p.y);
    final v = values['${p.x}_${p.y}'] ?? 0;
    final t = maxVal > minVal ? (v - minVal) / (maxVal - minVal) : 0.5;
    final color = Color.lerp(
      const Color(0xFF1565C0),
      const Color(0xFFE53935),
      t,
    )!;

    final rect = Rect.fromLTWH(
      context.bounds.left + xi * cellW,
      context.bounds.top + yi * cellH,
      cellW,
      cellH,
    ).deflate(1);

    drawRoundedBar(
      canvas,
      rect,
      radius: radius,
      paint: context.paintCache.fill('heat-${p.x}-${p.y}', color),
    );
  }
}