|
@@ -6,9 +6,8 @@ import '../core/network/dio_client.dart';
|
|
|
import '../data/models/home/app_header_item.dart';
|
|
import '../data/models/home/app_header_item.dart';
|
|
|
import '../data/models/home/market_ticker.dart';
|
|
import '../data/models/home/market_ticker.dart';
|
|
|
import '../data/models/home/activity_banner.dart';
|
|
import '../data/models/home/activity_banner.dart';
|
|
|
-import '../data/services/asset_service.dart';
|
|
|
|
|
import '../data/services/market_service.dart';
|
|
import '../data/services/market_service.dart';
|
|
|
-import '../data/services/spot_service.dart';
|
|
|
|
|
|
|
+import 'asset_provider.dart';
|
|
|
import 'auth_provider.dart';
|
|
import 'auth_provider.dart';
|
|
|
import 'coin_cache_provider.dart';
|
|
import 'coin_cache_provider.dart';
|
|
|
import 'top_trader_provider.dart';
|
|
import 'top_trader_provider.dart';
|
|
@@ -143,7 +142,7 @@ class HomeNotifier extends Notifier<HomeState> {
|
|
|
_safeUpdate((s) => s.copyWith(isLoggedIn: loggedIn));
|
|
_safeUpdate((s) => s.copyWith(isLoggedIn: loggedIn));
|
|
|
// 登录状态变更:刚登录时立即拉取资产;登出时清零
|
|
// 登录状态变更:刚登录时立即拉取资产;登出时清零
|
|
|
if (loggedIn && prev != true) {
|
|
if (loggedIn && prev != true) {
|
|
|
- _loadAssetData();
|
|
|
|
|
|
|
+ Future.microtask(() => ref.read(assetProvider.notifier).silentRefresh());
|
|
|
} else if (!loggedIn) {
|
|
} else if (!loggedIn) {
|
|
|
_safeUpdate((s) => s.copyWith(totalAsset: 0, todayPnl: 0, todayPnlPct: 0, todayPnlRateAvailable: true));
|
|
_safeUpdate((s) => s.copyWith(totalAsset: 0, todayPnl: 0, todayPnlPct: 0, todayPnlRateAvailable: true));
|
|
|
}
|
|
}
|
|
@@ -208,9 +207,9 @@ class HomeNotifier extends Notifier<HomeState> {
|
|
|
appHeaders: appHeaders,
|
|
appHeaders: appHeaders,
|
|
|
));
|
|
));
|
|
|
|
|
|
|
|
- // 已登录时加载总资产 + 今日盈亏
|
|
|
|
|
|
|
+ // 已登录时刷新资产(首页卡片与资产页共用 assetProvider)
|
|
|
if (!_disposed && state.isLoggedIn) {
|
|
if (!_disposed && state.isLoggedIn) {
|
|
|
- _loadAssetData();
|
|
|
|
|
|
|
+ Future.microtask(() => ref.read(assetProvider.notifier).silentRefresh());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 收集所有需要订阅的 symbol(去重)
|
|
// 收集所有需要订阅的 symbol(去重)
|
|
@@ -279,51 +278,22 @@ class HomeNotifier extends Notifier<HomeState> {
|
|
|
}).toList();
|
|
}).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 {
|
|
Future<void> refresh() async {
|
|
|
- await Future.wait([
|
|
|
|
|
|
|
+ final futures = <Future<void>>[
|
|
|
_loadData(),
|
|
_loadData(),
|
|
|
ref.read(topTraderProvider.notifier).refresh(),
|
|
ref.read(topTraderProvider.notifier).refresh(),
|
|
|
- ]);
|
|
|
|
|
|
|
+ ];
|
|
|
|
|
+ if (state.isLoggedIn) {
|
|
|
|
|
+ futures.add(ref.read(assetProvider.notifier).silentRefresh());
|
|
|
|
|
+ }
|
|
|
|
|
+ await Future.wait(futures);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /// 仅刷新资产数据(点击资产卡片触发)
|
|
|
|
|
|
|
+ /// 仅刷新资产数据(切回首页 Tab 时触发,与资产页同源)
|
|
|
Future<void> refreshAsset() async {
|
|
Future<void> refreshAsset() async {
|
|
|
if (!state.isLoggedIn) return;
|
|
if (!state.isLoggedIn) return;
|
|
|
- await _loadAssetData();
|
|
|
|
|
|
|
+ await ref.read(assetProvider.notifier).silentRefresh();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// 切换市场 Tab
|
|
/// 切换市场 Tab
|