From a97e0b51b8a12ed3bda058219595009357c5358a Mon Sep 17 00:00:00 2001 From: hailin Date: Mon, 19 Jan 2026 18:03:23 -0800 Subject: [PATCH] =?UTF-8?q?feat(kline):=20=E9=A6=96=E6=AC=A1=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E6=97=B6=E8=AE=A9=E6=9C=80=E6=96=B0K=E7=BA=BF?= =?UTF-8?q?=E5=B1=85=E4=B8=AD=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 _scrollToCenter() 方法,计算让最新K线居中的滚动位置 - 初始化时调用 _scrollToCenter() 替代 _scrollToEnd() - 如果K线总宽度小于屏幕宽度,不滚动,从左开始显示 - 保留 _scrollToEnd() 方法供刷新按钮等场景使用 Co-Authored-By: Claude Opus 4.5 --- .../kline_chart/kline_chart_widget.dart | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 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 edc52c45..9bdad374 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 @@ -83,13 +83,38 @@ class _KlineChartWidgetState extends State { _candleWidth = idealWidth.clamp(_minCandleWidth, _maxCandleWidth); _prevCandleWidth = _candleWidth; - // 滚动到最右边(显示最新数据) - _scrollToEnd(); + // 首次加载时让最新 K 线居中显示 + _scrollToCenter(); } + /// 滚动使最新 K 线居中显示 + /// + /// 计算逻辑: + /// - 如果 K 线总宽度小于屏幕宽度,不滚动,从左开始显示 + /// - 否则计算让最新 K 线中心位于屏幕中央的滚动位置 + void _scrollToCenter() { + if (widget.klines.isEmpty || _chartWidth == 0) return; + + final totalWidth = widget.klines.length * _candleWidth; + + if (totalWidth <= _chartWidth) { + // K 线总宽度小于等于屏幕宽度,不需要滚动,从左开始显示 + _scrollX = 0; + } else { + // 计算让最新 K 线居中的滚动位置 + // 最新 K 线的中心位置 = (K线数量 - 0.5) * 单根K线宽度 + final lastKlineCenter = (widget.klines.length - 0.5) * _candleWidth; + // 目标滚动位置 = 最新K线中心 - 屏幕宽度的一半 + final targetScroll = lastKlineCenter - _chartWidth / 2; + // 限制在有效滚动范围内 + final maxScroll = totalWidth - _chartWidth; + _scrollX = targetScroll.clamp(0.0, maxScroll); + } + } + + /// 滚动到最右边(显示最新数据在右侧) void _scrollToEnd() { if (widget.klines.isEmpty || _chartWidth == 0) return; - // 滚动到最右边(显示最新数据) final totalWidth = widget.klines.length * _candleWidth; final maxScroll = math.max(0.0, totalWidth - _chartWidth); _scrollX = maxScroll;