From f149c2a06a2c520c37f53e1a998ac958b7c41e2f Mon Sep 17 00:00:00 2001 From: hailin Date: Mon, 19 Jan 2026 20:39:33 -0800 Subject: [PATCH] =?UTF-8?q?fix(kline):=20=E6=95=B0=E6=8D=AE=E9=87=8F?= =?UTF-8?q?=E5=A4=A7=E6=97=B6=E5=8F=AA=E5=8F=96=E6=9C=80=E8=BF=91=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=EF=BC=8C=E8=AE=A9=E6=9C=80=E6=96=B0K=E7=BA=BF?= =?UTF-8?q?=E5=9C=A8=E5=B1=8F=E5=B9=95=E4=B8=AD=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.5 --- .../kline_chart/kline_chart_widget.dart | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/frontend/mining-app/lib/presentation/widgets/kline_chart/kline_chart_widget.dart b/frontend/mining-app/lib/presentation/widgets/kline_chart/kline_chart_widget.dart index 32c9d7ec..0cd5b451 100644 --- a/frontend/mining-app/lib/presentation/widgets/kline_chart/kline_chart_widget.dart +++ b/frontend/mining-app/lib/presentation/widgets/kline_chart/kline_chart_widget.dart @@ -568,19 +568,29 @@ class _KlineChartWidgetState extends State { }); } - // 数据处理 - 基于像素滚动计算可见数据 + // 数据处理 - 计算要显示的K线数据 + // 逻辑:最新K线在屏幕中心,只取中心到左边缘能显示的数量 _VisibleData _getVisibleData(double chartWidth) { if (widget.klines.isEmpty || chartWidth == 0) { return _VisibleData(klines: [], startIndex: 0, candleWidth: _candleWidth); } - // 根据滚动位置计算可见的K线范围 - final int startIndex = (_scrollX / _candleWidth).floor().clamp(0, widget.klines.length - 1); - final int visibleCount = (chartWidth / _candleWidth).ceil() + 1; // +1 确保边缘K线可见 - final int endIndex = math.min(startIndex + visibleCount, widget.klines.length); + // 计算屏幕中心到左边缘能显示多少根K线 + final int halfScreenCount = (chartWidth / 2 / _candleWidth).ceil(); + // 数据量不够半屏时,显示全部 + if (widget.klines.length <= halfScreenCount) { + return _VisibleData( + klines: widget.klines, + startIndex: 0, + candleWidth: _candleWidth, + ); + } + + // 数据量足够时,只取最近的 halfScreenCount 根,让最新那根在屏幕中心 + final int startIndex = widget.klines.length - halfScreenCount; return _VisibleData( - klines: widget.klines.sublist(startIndex, endIndex), + klines: widget.klines.sublist(startIndex), startIndex: startIndex, candleWidth: _candleWidth, );