drawChart method

  1. @override
void drawChart(
  1. Canvas canvas,
  2. Size size
)
override

Implementation

@override
void drawChart(Canvas canvas, Size size) {
  canvas.save();
  canvas.translate(mTranslateX * scaleX, 0.0);
  canvas.scale(scaleX, 1.0);
  for (int i = mStartIndex; datas != null && i <= mStopIndex; i++) {
    KLineEntity? curPoint = datas?[i];
    if (curPoint == null) continue;
    KLineEntity lastPoint = i == 0 ? curPoint : datas![i - 1];
    double curX = getX(i);
    double lastX = i == 0 ? curX : getX(i - 1);
    if (isShowMainState == true) {
      mMainRenderer.drawChart(lastPoint, curPoint, lastX, curX, size, canvas);

      mVolRenderer?.drawChart(lastPoint, curPoint, lastX, curX, size, canvas);
    }

    for (int j = 0; j < secondaryRenderers.length; j++) {
      // print('[drawChart] Renderer [$j]: Drawing state ${secondaryStates[j]}');

      secondaryRenderers[j]?.drawChart(
        lastPoint,
        curPoint,
        lastX,
        curX,
        size,
        canvas,
      );
      // 添加日志
      // print('[drawChart] Renderer [$j]: State = ${secondaryStates[j]}, '
      //     'Rect = ${secondaryRenderers[j]?.rect}');
    }

    // —— 副图信号回调 ——
    for (final st in secondaryStates) {
      final prov = _secProviders[st];
      if (prov != null && i == mStopIndex) {
        final prob = curPoint.probability ?? 1.0;
        if (prov.isBuy(datas!, i)) {
          onGoingUp?.call(prob);
        } else if (prov.isSell(datas!, i)) {
          onGoingDown?.call(prob);
        }
      }
    }

    // —— 主图信号回调 ——
    // chart_painter.dart -> drawChart(...) 循环内,紧跟在原有信号回调逻辑之后:
// —— 组装概率并上送 —— 只在最后一根触发,避免一屏里多次
    if (i == mStopIndex && onUpProbs != null) {
      // 主图概率
      double? mainUp;
      final mprov = _mainProviders[mainState];
      if (mprov != null) {
        mainUp = mprov.upProb(datas!, i);
      }

      // 副图概率
      final Map<SecondaryState, double?> secUps = {};
      for (final st in secondaryStates) {
        final prov = _secProviders[st];
        double? p;
        if (prov != null) {
          p = prov.upProb(datas!, i);
        } else {
          p = null; // 没有 provider 就不上送
        }
        secUps[st] = p;
      }

      final report = UpProbReport(
        index: i,
        time: curPoint.time,
        mainUp: mainUp,
        secondaryUps: secUps,
      );

      // 去抖:只有变了才上送
      if (_lastReport == null || !report.almostEquals(_lastReport!)) {
        _lastReport = report;
        onUpProbs?.call(report);
      }
    }
  }

  if ((isLongPress == true || (isTapShowInfoDialog && isOnTap)) &&
      isTrendLine == false) {
    drawCrossLine(canvas, size);
  }
  if (isTrendLine == true) drawTrendLines(canvas, size);

  // —— 在完成所有主图/副图绘制后,画交易标注 —— //
  if (showTradeMarks && tradeMarks.isNotEmpty) {
    _drawTradeMarks(canvas);
  }

  canvas.restore();
}