111
This commit is contained in:
@@ -7,7 +7,7 @@ import '../data/models/order_models.dart';
|
||||
import '../data/services/asset_service.dart';
|
||||
import '../data/services/fund_service.dart';
|
||||
|
||||
/// 资产状态管理
|
||||
/// 資產狀態管理
|
||||
class AssetProvider extends ChangeNotifier {
|
||||
final AssetService _assetService;
|
||||
final FundService _fundService;
|
||||
@@ -23,7 +23,7 @@ class AssetProvider extends ChangeNotifier {
|
||||
bool _isLoadingOrders = false;
|
||||
String? _error;
|
||||
|
||||
// 加载状态标记,防止重复加载
|
||||
// 加載狀態標記,防止重複加載
|
||||
bool _overviewLoaded = false;
|
||||
bool _fundAccountLoaded = false;
|
||||
bool _tradeAccountLoaded = false;
|
||||
@@ -42,9 +42,9 @@ class AssetProvider extends ChangeNotifier {
|
||||
bool get isLoadingOrders => _isLoadingOrders;
|
||||
String? get error => _error;
|
||||
|
||||
/// 加载资产总览
|
||||
/// 加載資產總覽
|
||||
Future<void> loadOverview({bool force = false}) async {
|
||||
// 如果已经加载过且不是强制刷新,则跳过
|
||||
// 如果已經加載過且不是強制刷新,則跳過
|
||||
if (_overviewLoaded && !force && _overview != null) {
|
||||
return;
|
||||
}
|
||||
@@ -62,16 +62,16 @@ class AssetProvider extends ChangeNotifier {
|
||||
_error = response.message;
|
||||
}
|
||||
} catch (e) {
|
||||
_error = '加载失败: $e';
|
||||
_error = '加載失敗: $e';
|
||||
}
|
||||
|
||||
_isLoading = false;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// 加载资金账户
|
||||
/// 加載資金賬戶
|
||||
Future<void> loadFundAccount({bool force = false}) async {
|
||||
// 如果已经加载过且不是强制刷新,则跳过
|
||||
// 如果已經加載過且不是強制刷新,則跳過
|
||||
if (_fundAccountLoaded && !force && _fundAccount != null) {
|
||||
return;
|
||||
}
|
||||
@@ -84,13 +84,13 @@ class AssetProvider extends ChangeNotifier {
|
||||
notifyListeners();
|
||||
}
|
||||
} catch (_) {
|
||||
// 忽略错误
|
||||
// 忽略錯誤
|
||||
}
|
||||
}
|
||||
|
||||
/// 加载交易账户
|
||||
/// 加載交易賬戶
|
||||
Future<void> loadTradeAccount({bool force = false}) async {
|
||||
// 如果已经加载过且不是强制刷新,则跳过
|
||||
// 如果已經加載過且不是強制刷新,則跳過
|
||||
if (_tradeAccountLoaded && !force && _tradeAccounts.isNotEmpty) {
|
||||
return;
|
||||
}
|
||||
@@ -103,11 +103,11 @@ class AssetProvider extends ChangeNotifier {
|
||||
notifyListeners();
|
||||
}
|
||||
} catch (_) {
|
||||
// 忽略错误
|
||||
// 忽略錯誤
|
||||
}
|
||||
}
|
||||
|
||||
/// 加载资金流水
|
||||
/// 加載資金流水
|
||||
Future<void> loadFlows({int? flowType, int pageNum = 1}) async {
|
||||
_isLoadingFlows = true;
|
||||
notifyListeners();
|
||||
@@ -122,14 +122,14 @@ class AssetProvider extends ChangeNotifier {
|
||||
_flows = list?.map((e) => AccountFlow.fromJson(e as Map<String, dynamic>)).toList() ?? [];
|
||||
}
|
||||
} catch (_) {
|
||||
// 忽略错误
|
||||
// 忽略錯誤
|
||||
}
|
||||
|
||||
_isLoadingFlows = false;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// 划转资金
|
||||
/// 劃轉資金
|
||||
Future<ApiResponse<void>> transfer({
|
||||
required int direction,
|
||||
required String amount,
|
||||
@@ -140,7 +140,7 @@ class AssetProvider extends ChangeNotifier {
|
||||
amount: amount,
|
||||
);
|
||||
if (response.success) {
|
||||
// 强制刷新数据
|
||||
// 強制刷新數據
|
||||
await loadOverview(force: true);
|
||||
await loadFundAccount(force: true);
|
||||
await loadTradeAccount(force: true);
|
||||
@@ -148,11 +148,11 @@ class AssetProvider extends ChangeNotifier {
|
||||
}
|
||||
return response;
|
||||
} catch (e) {
|
||||
return ApiResponse.fail('划转失败: $e');
|
||||
return ApiResponse.fail('劃轉失敗: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// 充值 - 返回订单详情包含钱包地址
|
||||
/// 充值 - 返回訂單詳情包含錢包地址
|
||||
Future<ApiResponse<Map<String, dynamic>>> deposit({required String amount, String? remark}) async {
|
||||
try {
|
||||
final response = await _fundService.deposit(amount: amount, remark: remark);
|
||||
@@ -163,11 +163,11 @@ class AssetProvider extends ChangeNotifier {
|
||||
}
|
||||
return response;
|
||||
} catch (e) {
|
||||
return ApiResponse.fail('充值申请失败: $e');
|
||||
return ApiResponse.fail('充值申請失敗: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// 确认已打款
|
||||
/// 確認已打款
|
||||
Future<ApiResponse<void>> confirmPay(String orderNo) async {
|
||||
try {
|
||||
final response = await _fundService.confirmPay(orderNo);
|
||||
@@ -177,11 +177,11 @@ class AssetProvider extends ChangeNotifier {
|
||||
}
|
||||
return response;
|
||||
} catch (e) {
|
||||
return ApiResponse.fail('确认打款失败: $e');
|
||||
return ApiResponse.fail('確認打款失敗: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// 提现
|
||||
/// 提現
|
||||
Future<ApiResponse<Map<String, dynamic>>> withdraw({
|
||||
required String amount,
|
||||
required String withdrawAddress,
|
||||
@@ -205,11 +205,11 @@ class AssetProvider extends ChangeNotifier {
|
||||
}
|
||||
return response;
|
||||
} catch (e) {
|
||||
return ApiResponse.fail('提现申请失败: $e');
|
||||
return ApiResponse.fail('提現申請失敗: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// 加载充提订单
|
||||
/// 加載充提訂單
|
||||
Future<void> loadFundOrders({int? type, int pageNum = 1, int pageSize = 20}) async {
|
||||
_isLoadingOrders = true;
|
||||
notifyListeners();
|
||||
@@ -225,14 +225,14 @@ class AssetProvider extends ChangeNotifier {
|
||||
_fundOrders = _fundService.parseOrderList(list);
|
||||
}
|
||||
} catch (_) {
|
||||
// 忽略错误
|
||||
// 忽略錯誤
|
||||
}
|
||||
|
||||
_isLoadingOrders = false;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// 取消订单
|
||||
/// 取消訂單
|
||||
Future<ApiResponse<void>> cancelOrder(String orderNo) async {
|
||||
try {
|
||||
final response = await _fundService.cancelOrder(orderNo);
|
||||
@@ -242,11 +242,11 @@ class AssetProvider extends ChangeNotifier {
|
||||
}
|
||||
return response;
|
||||
} catch (e) {
|
||||
return ApiResponse.fail('取消订单失败: $e');
|
||||
return ApiResponse.fail('取消訂單失敗: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// 获取可用提现网络列表
|
||||
/// 獲取可用提現網絡列表
|
||||
Future<List<String>> getWalletNetworks() async {
|
||||
try {
|
||||
final response = await _fundService.getWalletNetworks();
|
||||
@@ -259,7 +259,7 @@ class AssetProvider extends ChangeNotifier {
|
||||
}
|
||||
}
|
||||
|
||||
/// 刷新所有资产数据
|
||||
/// 刷新所有資產數據
|
||||
Future<void> refreshAll({bool force = false}) async {
|
||||
await Future.wait([
|
||||
loadOverview(force: force),
|
||||
@@ -268,7 +268,7 @@ class AssetProvider extends ChangeNotifier {
|
||||
]);
|
||||
}
|
||||
|
||||
/// 重置加载状态(用于退出登录时)
|
||||
/// 重置加載狀態(用於退出登錄時)
|
||||
void resetLoadState() {
|
||||
_overviewLoaded = false;
|
||||
_fundAccountLoaded = false;
|
||||
|
||||
@@ -6,7 +6,7 @@ import '../core/storage/local_storage.dart';
|
||||
import '../data/models/user.dart';
|
||||
import '../data/services/user_service.dart';
|
||||
|
||||
/// 认证状态管理
|
||||
/// 認證狀態管理
|
||||
class AuthProvider extends ChangeNotifier {
|
||||
final UserService _userService;
|
||||
|
||||
@@ -25,7 +25,7 @@ class AuthProvider extends ChangeNotifier {
|
||||
bool get isLoading => _isLoading;
|
||||
String? get token => _token;
|
||||
|
||||
/// 初始化认证状态
|
||||
/// 初始化認證狀態
|
||||
Future<void> _initAuth() async {
|
||||
_token = LocalStorage.getToken();
|
||||
_isLoggedIn = _token?.isNotEmpty == true;
|
||||
@@ -41,12 +41,12 @@ class AuthProvider extends ChangeNotifier {
|
||||
return userJson != null ? User.fromJson(userJson) : null;
|
||||
}
|
||||
|
||||
/// 登录
|
||||
/// 登錄
|
||||
Future<ApiResponse<User>> login(String username, String password) {
|
||||
return _authenticate(() => _userService.login(username, password));
|
||||
}
|
||||
|
||||
/// 注册(含身份证图片和可选推广码)
|
||||
/// 註冊(含身份證圖片和可選推廣碼)
|
||||
Future<ApiResponse<User>> register(
|
||||
String username,
|
||||
String password, {
|
||||
@@ -63,7 +63,7 @@ class AuthProvider extends ChangeNotifier {
|
||||
));
|
||||
}
|
||||
|
||||
/// 统一认证处理
|
||||
/// 統一認證處理
|
||||
Future<ApiResponse<User>> _authenticate(
|
||||
Future<ApiResponse<Map<String, dynamic>>> Function() action,
|
||||
) async {
|
||||
@@ -73,18 +73,18 @@ class AuthProvider extends ChangeNotifier {
|
||||
final response = await action();
|
||||
|
||||
if (!response.success || response.data == null) {
|
||||
return ApiResponse.fail(response.message ?? '操作失败');
|
||||
return ApiResponse.fail(response.message ?? '操作失敗');
|
||||
}
|
||||
|
||||
return _handleAuthSuccess(response.data!, response.message);
|
||||
} catch (e) {
|
||||
return ApiResponse.fail('操作失败: $e');
|
||||
return ApiResponse.fail('操作失敗: $e');
|
||||
} finally {
|
||||
_setLoading(false);
|
||||
}
|
||||
}
|
||||
|
||||
/// 处理认证成功
|
||||
/// 處理認證成功
|
||||
ApiResponse<User> _handleAuthSuccess(
|
||||
Map<String, dynamic> data,
|
||||
String? message,
|
||||
@@ -107,17 +107,17 @@ class AuthProvider extends ChangeNotifier {
|
||||
|
||||
return _user != null
|
||||
? ApiResponse.success(_user!, message)
|
||||
: ApiResponse.fail('用户信息获取失败');
|
||||
: ApiResponse.fail('用戶信息獲取失敗');
|
||||
}
|
||||
|
||||
/// 退出登录
|
||||
/// 退出登錄
|
||||
Future<void> logout() async {
|
||||
_setLoading(true);
|
||||
|
||||
try {
|
||||
await _userService.logout();
|
||||
} catch (_) {
|
||||
// 忽略退出登录的接口错误
|
||||
// 忽略退出登錄的接口錯誤
|
||||
}
|
||||
|
||||
_clearAuthState();
|
||||
@@ -131,13 +131,13 @@ class AuthProvider extends ChangeNotifier {
|
||||
_isLoggedIn = false;
|
||||
}
|
||||
|
||||
/// 强制登出(token 过期时由 DioClient 回调触发)
|
||||
/// 強制登出(token 過期時由 DioClient 回調觸發)
|
||||
void forceLogout() {
|
||||
_clearAuthState();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// 刷新用户信息
|
||||
/// 刷新用戶信息
|
||||
Future<void> refreshUserInfo() async {
|
||||
if (!_isLoggedIn) return;
|
||||
|
||||
@@ -149,11 +149,11 @@ class AuthProvider extends ChangeNotifier {
|
||||
notifyListeners();
|
||||
}
|
||||
} catch (_) {
|
||||
// 忽略错误
|
||||
// 忽略錯誤
|
||||
}
|
||||
}
|
||||
|
||||
/// 提交KYC实名认证(真实图片上传)
|
||||
/// 提交KYC實名認證(真實圖片上傳)
|
||||
Future<ApiResponse<void>> submitKyc(
|
||||
Uint8List frontBytes, Uint8List backBytes) async {
|
||||
try {
|
||||
@@ -164,7 +164,7 @@ class AuthProvider extends ChangeNotifier {
|
||||
}
|
||||
return response;
|
||||
} catch (e) {
|
||||
return ApiResponse.fail('KYC提交失败: $e');
|
||||
return ApiResponse.fail('KYC提交失敗: $e');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
|
||||
import '../data/models/coin.dart';
|
||||
import '../data/services/market_service.dart';
|
||||
|
||||
/// 行情状态管理
|
||||
/// 行情狀態管理
|
||||
class MarketProvider extends ChangeNotifier {
|
||||
final MarketService _marketService;
|
||||
|
||||
@@ -18,16 +18,16 @@ class MarketProvider extends ChangeNotifier {
|
||||
bool get isLoading => _isLoading;
|
||||
String? get error => _error;
|
||||
|
||||
/// BTC 和 ETH(上半区展示)
|
||||
/// BTC 和 ETH(上半區展示)
|
||||
List<Coin> get featuredCoins =>
|
||||
_allCoins.where((c) => c.code == 'BTC' || c.code == 'ETH').toList();
|
||||
|
||||
/// 排除 BTC、ETH、USDT 的代币列表(下半区展示)
|
||||
/// 排除 BTC、ETH、USDT 的代幣列表(下半區展示)
|
||||
List<Coin> get otherCoins => _allCoins
|
||||
.where((c) => !{'BTC', 'ETH', 'USDT'}.contains(c.code))
|
||||
.toList();
|
||||
|
||||
/// 加载币种列表
|
||||
/// 加載幣種列表
|
||||
Future<void> loadCoins({bool force = false}) async {
|
||||
if (_coinsLoaded && !force && _allCoins.isNotEmpty) {
|
||||
return;
|
||||
@@ -47,14 +47,14 @@ class MarketProvider extends ChangeNotifier {
|
||||
_error = response.message;
|
||||
}
|
||||
} catch (e) {
|
||||
_error = '加载失败: $e';
|
||||
_error = '加載失敗: $e';
|
||||
}
|
||||
|
||||
_isLoading = false;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// 根据代码获取币种
|
||||
/// 根據代碼獲取幣種
|
||||
Coin? getCoinByCode(String code) {
|
||||
try {
|
||||
return _allCoins.firstWhere((c) => c.code == code);
|
||||
@@ -68,7 +68,7 @@ class MarketProvider extends ChangeNotifier {
|
||||
await loadCoins(force: true);
|
||||
}
|
||||
|
||||
/// 重置加载状态(用于退出登录时)
|
||||
/// 重置加載狀態(用於退出登錄時)
|
||||
void resetLoadState() {
|
||||
_coinsLoaded = false;
|
||||
_allCoins = [];
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
/// 主题提供者 - 管理明暗主题切换
|
||||
/// 主題提供者 - 管理明暗主題切換
|
||||
///
|
||||
/// 功能:
|
||||
/// - 支持浅色/深色/跟随系统三种模式
|
||||
/// - 持久化主题设置到本地存储
|
||||
/// - 提供主题切换方法
|
||||
/// - 支持淺色/深色/跟隨系統三種模式
|
||||
/// - 持久化主題設置到本地存儲
|
||||
/// - 提供主題切換方法
|
||||
class ThemeProvider extends ChangeNotifier {
|
||||
static const String _themeModeKey = 'theme_mode';
|
||||
|
||||
ThemeMode _themeMode = ThemeMode.dark;
|
||||
|
||||
/// 当前主题模式
|
||||
/// 當前主題模式
|
||||
ThemeMode get themeMode => _themeMode;
|
||||
|
||||
/// 是否为深色模式
|
||||
/// 是否為深色模式
|
||||
bool get isDarkMode => _themeMode == ThemeMode.dark;
|
||||
|
||||
/// 初始化主题设置(从本地存储加载)
|
||||
/// 初始化主題設置(從本地存儲加載)
|
||||
Future<void> init() async {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
final modeString = prefs.getString(_themeModeKey);
|
||||
@@ -32,14 +32,14 @@ class ThemeProvider extends ChangeNotifier {
|
||||
}
|
||||
}
|
||||
|
||||
/// 切换主题(浅色/深色)
|
||||
/// 切換主題(淺色/深色)
|
||||
Future<void> toggleTheme() async {
|
||||
_themeMode = _themeMode == ThemeMode.light ? ThemeMode.dark : ThemeMode.light;
|
||||
await _saveThemeMode();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// 设置主题模式
|
||||
/// 設置主題模式
|
||||
Future<void> setThemeMode(ThemeMode mode) async {
|
||||
if (_themeMode == mode) return;
|
||||
_themeMode = mode;
|
||||
@@ -47,7 +47,7 @@ class ThemeProvider extends ChangeNotifier {
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// 保存主题设置到本地存储
|
||||
/// 保存主題設置到本地存儲
|
||||
Future<void> _saveThemeMode() async {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
await prefs.setString(_themeModeKey, _themeMode.toString());
|
||||
|
||||
Reference in New Issue
Block a user