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 6ec0eb4e..02f65954 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 @@ -121,6 +121,7 @@ class _KlineChartWidgetState extends State { // 当 K 线数据变化时,重新初始化 if (oldWidget.klines.length != widget.klines.length) { _initialized = false; + _displayStartIndex = 0; // 重置起始索引 } } @@ -572,11 +573,21 @@ class _KlineChartWidgetState extends State { ); } - // 根据 _displayStartIndex 取数据 - final int endIndex = math.min(_displayStartIndex + fullScreenCount, widget.klines.length); + // 如果还未初始化,先计算正确的起始索引(让最新K线在中心) + int startIndex = _displayStartIndex; + if (!_initialized) { + final int halfScreenCount = (chartWidth / 2 / _candleWidth).ceil(); + startIndex = math.max(0, widget.klines.length - halfScreenCount); + } + + // 确保 startIndex 在有效范围内 + final int maxStartIndex = math.max(0, widget.klines.length - fullScreenCount); + startIndex = startIndex.clamp(0, maxStartIndex); + + final int endIndex = math.min(startIndex + fullScreenCount, widget.klines.length); return _VisibleData( - klines: widget.klines.sublist(_displayStartIndex, endIndex), - startIndex: _displayStartIndex, + klines: widget.klines.sublist(startIndex, endIndex), + startIndex: startIndex, candleWidth: _candleWidth, ); }