diff --git a/frontend/mining-app/lib/presentation/pages/trading/trading_page.dart b/frontend/mining-app/lib/presentation/pages/trading/trading_page.dart index ff738bed..41da2b50 100644 --- a/frontend/mining-app/lib/presentation/pages/trading/trading_page.dart +++ b/frontend/mining-app/lib/presentation/pages/trading/trading_page.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; @@ -41,12 +42,15 @@ class _TradingPageState extends ConsumerState { bool _isEditingQuantity = false; // 正在编辑数量(防止循环更新) bool _isEditingAmount = false; // 正在编辑金额(防止循环更新) bool _isFullScreen = false; // K线图全屏状态 + int _countdown = 60; // 价格刷新倒计时(秒) + Timer? _countdownTimer; // K线周期选项:分钟级 → 小时级 → 日/周/月/年 final List _timeRanges = ['1分', '5分', '15分', '30分', '1时', '4时', '日', '周', '月', '年']; @override void dispose() { + _countdownTimer?.cancel(); _quantityController.dispose(); _priceController.dispose(); _amountInputController.dispose(); @@ -60,6 +64,16 @@ class _TradingPageState extends ConsumerState { WidgetsBinding.instance.addPostFrameCallback((_) { ref.read(klinesNotifierProvider.notifier).loadKlines(_timeRanges[_selectedTimeRange]); }); + // 启动价格刷新倒计时(每秒递减,到0时重置为60) + _countdownTimer = Timer.periodic(const Duration(seconds: 1), (_) { + setState(() { + if (_countdown <= 1) { + _countdown = 60; + } else { + _countdown--; + } + }); + }); } @override @@ -165,13 +179,26 @@ class _TradingPageState extends ConsumerState { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - '当前积分股价值', - style: TextStyle( - fontSize: 12, - fontWeight: FontWeight.w500, - color: AppColors.textSecondaryOf(context), - ), + Row( + children: [ + Text( + '当前积分股价值', + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.w500, + color: AppColors.textSecondaryOf(context), + ), + ), + const SizedBox(width: 8), + // 刷新倒计时 + Text( + '${_countdown}s', + style: TextStyle( + fontSize: 11, + color: AppColors.textSecondaryOf(context).withValues(alpha: 0.6), + ), + ), + ], ), const SizedBox(height: 8), Row( diff --git a/frontend/mining-app/lib/presentation/providers/trading_providers.dart b/frontend/mining-app/lib/presentation/providers/trading_providers.dart index 5a833cc0..a76c75d2 100644 --- a/frontend/mining-app/lib/presentation/providers/trading_providers.dart +++ b/frontend/mining-app/lib/presentation/providers/trading_providers.dart @@ -261,13 +261,13 @@ final klinesProvider = FutureProvider>((ref) async { ); }); -// 当前价格 Provider (15秒缓存 - 交易页面需要快速更新) +// 当前价格 Provider (60秒缓存 - 与销毁调度器同步,每分钟刷新一次) final currentPriceProvider = FutureProvider((ref) async { final repository = ref.watch(tradingRepositoryProvider); final result = await repository.getCurrentPrice(); ref.keepAlive(); - final timer = Timer(const Duration(seconds: 15), () { + final timer = Timer(const Duration(seconds: 60), () { ref.invalidateSelf(); }); ref.onDispose(() => timer.cancel());