Эх сурвалжийг харах

fix(home): 首页总资产与资产页共用 assetProvider

修复首页资产卡片误读 homeProvider 独立请求导致显示 0,与资产总览数据保持一致。

Co-authored-by: Cursor <cursoragent@cursor.com>
jean 1 сар өмнө
parent
commit
8d19b3c4b0

+ 10 - 6
lib/presentation/screens/home/home_screen.dart

@@ -799,8 +799,12 @@ class _AssetCard extends ConsumerWidget {
     final isDark = Theme.of(context).brightness == Brightness.dark;
     final assetState = ref.watch(assetProvider);
     final obscure = assetState.obscureBalance;
-    final pnlColor = AppColors.changeColor(state.todayPnl);
-    final sign = state.todayPnl >= 0 ? '+' : '';
+    final total = assetState.totalUsdtValue;
+    final pnl = assetState.todayPnl;
+    final pnlRevenue = pnl?.revenue.toDouble() ?? 0;
+    final double? pnlRate = pnl?.revenueRate?.toDouble();
+    final pnlColor = AppColors.changeColor(pnlRevenue);
+    final sign = pnlRevenue >= 0 ? '+' : '';
 
     return Container(
       margin: const EdgeInsets.fromLTRB(16, 8, 16, 4),
@@ -862,7 +866,7 @@ class _AssetCard extends ConsumerWidget {
                 child: Text(
                   obscure
                       ? '****'
-                      : formatPrice(state.totalAsset, decimalPlaces: 2),
+                      : formatPrice(total, decimalPlaces: 2),
                   maxLines: 1,
                   overflow: TextOverflow.ellipsis,
                   style: TextStyle(
@@ -897,9 +901,9 @@ class _AssetCard extends ConsumerWidget {
                 child: Text(
                   obscure
                       ? '****'
-                      : state.todayPnlRateAvailable
-                          ? '$sign$fiatSymbol${(state.todayPnl * fiatRate).toStringAsFixed(2)} ($sign${state.todayPnlPct.toStringAsFixed(2)}%)'
-                          : '$sign$fiatSymbol${(state.todayPnl * fiatRate).toStringAsFixed(2)} (--)',
+                      : pnlRate != null
+                          ? '$sign$fiatSymbol${(pnlRevenue * fiatRate).toStringAsFixed(2)} ($sign${(pnlRate * 100).toStringAsFixed(2)}%)'
+                          : '$sign$fiatSymbol${(pnlRevenue * fiatRate).toStringAsFixed(2)} (--)',
                   maxLines: 1,
                   overflow: TextOverflow.ellipsis,
                   style: TextStyle(

+ 12 - 42
lib/providers/home_provider.dart

@@ -6,9 +6,8 @@ import '../core/network/dio_client.dart';
 import '../data/models/home/app_header_item.dart';
 import '../data/models/home/market_ticker.dart';
 import '../data/models/home/activity_banner.dart';
-import '../data/services/asset_service.dart';
 import '../data/services/market_service.dart';
-import '../data/services/spot_service.dart';
+import 'asset_provider.dart';
 import 'auth_provider.dart';
 import 'coin_cache_provider.dart';
 import 'top_trader_provider.dart';
@@ -143,7 +142,7 @@ class HomeNotifier extends Notifier<HomeState> {
       _safeUpdate((s) => s.copyWith(isLoggedIn: loggedIn));
       // 登录状态变更:刚登录时立即拉取资产;登出时清零
       if (loggedIn && prev != true) {
-        _loadAssetData();
+        Future.microtask(() => ref.read(assetProvider.notifier).silentRefresh());
       } else if (!loggedIn) {
         _safeUpdate((s) => s.copyWith(totalAsset: 0, todayPnl: 0, todayPnlPct: 0, todayPnlRateAvailable: true));
       }
@@ -208,9 +207,9 @@ class HomeNotifier extends Notifier<HomeState> {
         appHeaders: appHeaders,
       ));
 
-      // 已登录时加载总资产 + 今日盈亏
+      // 已登录时刷新资产(首页卡片与资产页共用 assetProvider)
       if (!_disposed && state.isLoggedIn) {
-        _loadAssetData();
+        Future.microtask(() => ref.read(assetProvider.notifier).silentRefresh());
       }
 
       // 收集所有需要订阅的 symbol(去重)
@@ -279,51 +278,22 @@ class HomeNotifier extends Notifier<HomeState> {
     }).toList();
   }
 
-  /// 加载总资产 + 今日盈亏(登录状态下调用)
-  /// 总资产 = 旧账户体系(合约/跟单/资金)+ 新现货账户
-  Future<void> _loadAssetData() async {
-    try {
-      final dio = ref.read(dioClientProvider);
-      final results = await Future.wait([
-        AssetService(dio).getTodayPnl(),
-        SpotService(dio).getAssets().catchError((_) => <String, dynamic>{}),
-      ]);
-
-      final pnl = results[0] as dynamic; // TodayPnl
-      final spotData = results[1] as Map<String, dynamic>;
-
-      final legacyTotal = (pnl.accountInfoList as List).isNotEmpty
-          ? (pnl.accountInfoList as List).fold(0.0, (sum, a) => sum + (a.currentCapital as dynamic).toDouble())
-          : (pnl.cashBalance as dynamic).toDouble();
-      final spotTotal = _toDoubleHome(spotData['totalAmount']);
-
-      _safeUpdate((s) => s.copyWith(
-        totalAsset: legacyTotal + spotTotal,
-        todayPnl: (pnl.revenue as dynamic).toDouble(),
-        todayPnlPct: ((pnl.revenueRate as dynamic)?.toDouble() ?? 0) * 100,
-        todayPnlRateAvailable: pnl.revenueRate != null,
-      ));
-    } catch (_) {}
-  }
-
-  static double _toDoubleHome(dynamic v) {
-    if (v == null) return 0.0;
-    if (v is num) return v.toDouble();
-    return double.tryParse(v.toString()) ?? 0.0;
-  }
-
   /// 下拉刷新:重新拉取行情 + 资产 + 顶级交易员
   Future<void> refresh() async {
-    await Future.wait([
+    final futures = <Future<void>>[
       _loadData(),
       ref.read(topTraderProvider.notifier).refresh(),
-    ]);
+    ];
+    if (state.isLoggedIn) {
+      futures.add(ref.read(assetProvider.notifier).silentRefresh());
+    }
+    await Future.wait(futures);
   }
 
-  /// 仅刷新资产数据(点击资产卡片触发)
+  /// 仅刷新资产数据(切回首页 Tab 时触发,与资产页同源)
   Future<void> refreshAsset() async {
     if (!state.isLoggedIn) return;
-    await _loadAssetData();
+    await ref.read(assetProvider.notifier).silentRefresh();
   }
 
   /// 切换市场 Tab