drawChart method
void
drawChart(
- Canvas canvas,
- 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();
}