From c28ccb6206976439e3c1818fa1c671594b1670ad Mon Sep 17 00:00:00 2001 From: hailin Date: Fri, 30 Jan 2026 11:03:41 -0800 Subject: [PATCH] =?UTF-8?q?fix(mining-app):=20=E6=80=BB=E8=B5=84=E4=BA=A7?= =?UTF-8?q?=E4=BC=B0=E5=80=BC=E4=BB=85=E6=98=BE=E7=A4=BA=E7=A7=AF=E5=88=86?= =?UTF-8?q?=E5=80=BC=EF=BC=8C=E6=9C=AA=E5=8C=85=E5=90=AB=E7=A7=AF=E5=88=86?= =?UTF-8?q?=E8=82=A1=E4=BC=B0=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:_calculateTotalAssetValue() 依赖 WebSocket 推送的 _currentPrice 和定时器初始化的 _currentShareBalance,在 WebSocket 未连接或定时器未 启动时这些值均为 0,导致 shareValue=0,总资产仅显示现金余额。 修复:当 WebSocket/_timer 未初始化时,回退到 API 返回的 asset.currentPrice、asset.burnMultiplier 和 asset.shareBalance, 与 _buildAssetList 中积分股估值的计算逻辑保持一致。 Co-Authored-By: Claude Opus 4.5 --- .../lib/presentation/pages/asset/asset_page.dart | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/frontend/mining-app/lib/presentation/pages/asset/asset_page.dart b/frontend/mining-app/lib/presentation/pages/asset/asset_page.dart index 58f509dc..9286c76e 100644 --- a/frontend/mining-app/lib/presentation/pages/asset/asset_page.dart +++ b/frontend/mining-app/lib/presentation/pages/asset/asset_page.dart @@ -126,13 +126,18 @@ class _AssetPageState extends ConsumerState { /// 积分股价值 = 当前积分股余额 × (1 + burnMultiplier) × price /// 积分值余额 = 可用积分值 + 冻结积分值 double _calculateTotalAssetValue(AssetDisplay? asset) { - // 优先使用 WebSocket 推送的价格,否则使用 API 返回的价格 - final price = double.tryParse(_currentPrice) ?? 0; - final burnMultiplier = double.tryParse(_currentBurnMultiplier) ?? 0; + // 优先使用 WebSocket 推送的价格,WebSocket 未连接时回退到 API 返回的价格 + final priceStr = _currentPrice != '0' ? _currentPrice : (asset?.currentPrice ?? '0'); + final price = double.tryParse(priceStr) ?? 0; + final bmStr = _currentBurnMultiplier != '0' ? _currentBurnMultiplier : (asset?.burnMultiplier ?? '0'); + final burnMultiplier = double.tryParse(bmStr) ?? 0; final multiplierFactor = 1 + burnMultiplier; - // 积分股价值 - final shareValue = _currentShareBalance * multiplierFactor * price; + // 积分股余额:定时器启动后使用实时值,否则回退到 API 返回的余额 + final shareBalance = _currentShareBalance > 0 + ? _currentShareBalance + : (double.tryParse(asset?.shareBalance ?? '0') ?? 0); + final shareValue = shareBalance * multiplierFactor * price; // 积分值余额(现金 = 可用 + 冻结) final availableCash = double.tryParse(asset?.availableCash ?? '0') ?? 0;