From 7cd022093b430be309ff407722c45dc6caf8c788 Mon Sep 17 00:00:00 2001 From: Rust Date: Sun, 2 Nov 2025 04:45:25 -0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20KRSecureStorage=20?= =?UTF-8?q?=E7=B1=BB=EF=BC=8C=E7=A1=AE=E4=BF=9D=E6=AF=8F=E6=AC=A1=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E5=89=8D=20box=20=E9=83=BD=E6=98=AF=E6=89=93=E5=BC=80?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E3=80=82=E7=9B=AE=E5=89=8D=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E4=BA=86=E4=BB=8E=E6=96=B0=E6=89=93=E5=BC=80app=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E7=8A=B6=E6=80=81=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit ab22be112a1753e5063799b5424f5d3feef06e2d) --- .../controllers/kr_home_controller.dart | 5 +- .../views/hi_animated_connect_button.dart | 19 +++++- .../views/kr_purchase_membership_view.dart | 1 + lib/app/utils/kr_secure_storage.dart | 63 +++++++++++++------ 4 files changed, 65 insertions(+), 23 deletions(-) diff --git a/lib/app/modules/kr_home/controllers/kr_home_controller.dart b/lib/app/modules/kr_home/controllers/kr_home_controller.dart index 51b2454..d1547b9 100755 --- a/lib/app/modules/kr_home/controllers/kr_home_controller.dart +++ b/lib/app/modules/kr_home/controllers/kr_home_controller.dart @@ -1,5 +1,8 @@ import 'dart:async'; import 'dart:io'; +import 'package:http/http.dart' as http; +import 'dart:convert'; + import 'package:flutter/material.dart'; import 'package:path_provider/path_provider.dart'; @@ -1075,7 +1078,7 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { // 后台切换成功,更新UI kr_cutSeletedTag.value = tag; kr_updateConnectionInfo(); - kr_moveToSelectedNode(); + // kr_moveToSelectedNode(); // 🚀 方案A增强:增加验证前等待时间,确保活动组完全更新 KRLogUtil.kr_i('⏳ [增强] 等待活动组更新(500ms)...', tag: 'HomeController'); diff --git a/lib/app/modules/kr_home/views/hi_animated_connect_button.dart b/lib/app/modules/kr_home/views/hi_animated_connect_button.dart index bc37677..4c3f12e 100644 --- a/lib/app/modules/kr_home/views/hi_animated_connect_button.dart +++ b/lib/app/modules/kr_home/views/hi_animated_connect_button.dart @@ -7,6 +7,8 @@ import 'package:kaer_with_panels/app/widgets/kr_local_image.dart'; import 'package:kaer_with_panels/app/widgets/dialogs/hi_dialog.dart'; import 'package:kaer_with_panels/app/widgets/kr_app_text_style.dart'; import 'package:kaer_with_panels/app/services/global_overlay_service.dart'; +import 'package:kaer_with_panels/app/services/singbox_imp/kr_sing_box_imp.dart'; +import 'package:kaer_with_panels/singbox/model/singbox_status.dart'; /// ✅ 按钮组件(带多层呼吸同心圆动画) class HIAnimatedConnectButton extends GetView { @@ -20,9 +22,18 @@ class HIAnimatedConnectButton extends GetView { @override Widget build(BuildContext context) { return Obx(() { - final isConnected = controller.kr_isConnected.value; final delay = controller.kr_currentNodeLatency.value; - print('当前连接情况$delay----$isConnected'); + + // 🔧 关键: 强制读取两个 observable 确保追踪 + final _ = KRSingBoxImp.instance.kr_status.value; // 强制追踪 + final isConnected = controller.kr_isConnected.value; // 使用 controller 的状态 + + // 再次读取状态用于判断 + final status = KRSingBoxImp.instance.kr_status.value; + final isSwitching = status is SingboxStarting || status is SingboxStopping; + + print('🔵 Switch UI 更新: status=${status.runtimeType}, isConnected=$isConnected, isSwitching=$isSwitching'); + final isShow = isConnected; // delay == -1 || isConnected; final Color buttonColor = Theme.of(context).primaryColor; @@ -71,6 +82,10 @@ class HIAnimatedConnectButton extends GetView { clipBehavior: Clip.antiAlias, child: InkWell( onTap: () { + if(isSwitching) { + print('🔵 Switch UI 正在更新,切换中点击了按钮: status=${status.runtimeType}, isConnected=$isConnected, isSwitching=$isSwitching'); + return; + } final hasValidSubscription = controller.kr_subscribeService.kr_availableSubscribes.isNotEmpty; if (hasValidSubscription) { diff --git a/lib/app/modules/kr_purchase_membership/views/kr_purchase_membership_view.dart b/lib/app/modules/kr_purchase_membership/views/kr_purchase_membership_view.dart index 5afebee..586ee56 100755 --- a/lib/app/modules/kr_purchase_membership/views/kr_purchase_membership_view.dart +++ b/lib/app/modules/kr_purchase_membership/views/kr_purchase_membership_view.dart @@ -15,6 +15,7 @@ import 'package:kaer_with_panels/app/widgets/dialogs/kr_dialog.dart'; import 'package:kaer_with_panels/app/widgets/kr_local_image.dart'; import 'package:kaer_with_panels/app/utils/kr_log_util.dart'; import 'dart:convert'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; diff --git a/lib/app/utils/kr_secure_storage.dart b/lib/app/utils/kr_secure_storage.dart index f16fecd..d28c22f 100755 --- a/lib/app/utils/kr_secure_storage.dart +++ b/lib/app/utils/kr_secure_storage.dart @@ -100,24 +100,38 @@ class KRSecureStorage { return hash.bytes; } - // 获取存储箱 - Box get _box => Hive.box(_boxName); + // 🔧 修复:确保 box 始终打开 + Future> _ensureBoxOpen() async { + if (!Hive.isBoxOpen(_boxName)) { + KRLogUtil.kr_w('⚠️ Box 未打开,重新打开: $_boxName', tag: 'SecureStorage'); + final key = HiveAesCipher(_generateKey()); + await Hive.openBox(_boxName, encryptionCipher: key); + KRLogUtil.kr_i('✅ Box 已重新打开', tag: 'SecureStorage'); + } + return Hive.box(_boxName); + } // 存储数据 Future kr_saveData({required String key, required String value}) async { try { - await _box.put(key, value); + final box = await _ensureBoxOpen(); + await box.put(key, value); + KRLogUtil.kr_i('✅ 数据已保存: $key', tag: 'SecureStorage'); } catch (e) { - KRLogUtil.kr_e('存储数据失败: $e', tag: 'SecureStorage'); + KRLogUtil.kr_e('❌ 存储数据失败: $e', tag: 'SecureStorage'); + rethrow; // 重新抛出异常,让调用者知道保存失败 } } // 读取数据 Future kr_readData({required String key}) async { try { - return _box.get(key) as String?; + final box = await _ensureBoxOpen(); + final value = box.get(key) as String?; + KRLogUtil.kr_i('📖 读取数据: $key = ${value != null ? "存在" : "null"}', tag: 'SecureStorage'); + return value; } catch (e) { - KRLogUtil.kr_e('读取数据失败: $e', tag: 'SecureStorage'); + KRLogUtil.kr_e('❌ 读取数据失败: $e', tag: 'SecureStorage'); return null; } } @@ -125,27 +139,32 @@ class KRSecureStorage { // 删除数据 Future kr_deleteData({required String key}) async { try { - await _box.delete(key); + final box = await _ensureBoxOpen(); + await box.delete(key); + KRLogUtil.kr_i('🗑️ 数据已删除: $key', tag: 'SecureStorage'); } catch (e) { - KRLogUtil.kr_e('删除数据失败: $e', tag: 'SecureStorage'); + KRLogUtil.kr_e('❌ 删除数据失败: $e', tag: 'SecureStorage'); } } // 清除所有数据 Future kr_clearAllData() async { try { - await _box.clear(); + final box = await _ensureBoxOpen(); + await box.clear(); + KRLogUtil.kr_i('🧹 所有数据已清除', tag: 'SecureStorage'); } catch (e) { - KRLogUtil.kr_e('清除数据失败: $e', tag: 'SecureStorage'); + KRLogUtil.kr_e('❌ 清除数据失败: $e', tag: 'SecureStorage'); } } // 检查键是否存在 Future kr_hasKey({required String key}) async { try { - return _box.containsKey(key); + final box = await _ensureBoxOpen(); + return box.containsKey(key); } catch (e) { - KRLogUtil.kr_e('检查键失败: $e', tag: 'SecureStorage'); + KRLogUtil.kr_e('❌ 检查键失败: $e', tag: 'SecureStorage'); return false; } } @@ -153,18 +172,20 @@ class KRSecureStorage { // 保存布尔值 Future kr_saveBool({required String key, required bool value}) async { try { - await _box.put(key, value); + final box = await _ensureBoxOpen(); + await box.put(key, value); } catch (e) { - KRLogUtil.kr_e('存储布尔值失败: $e', tag: 'SecureStorage'); + KRLogUtil.kr_e('❌ 存储布尔值失败: $e', tag: 'SecureStorage'); } } // 获取布尔值 Future kr_getBool({required String key}) async { try { - return _box.get(key) as bool?; + final box = await _ensureBoxOpen(); + return box.get(key) as bool?; } catch (e) { - KRLogUtil.kr_e('读取布尔值失败: $e', tag: 'SecureStorage'); + KRLogUtil.kr_e('❌ 读取布尔值失败: $e', tag: 'SecureStorage'); return null; } } @@ -172,18 +193,20 @@ class KRSecureStorage { // 保存整数 Future kr_saveInt({required String key, required int value}) async { try { - await _box.put(key, value); + final box = await _ensureBoxOpen(); + await box.put(key, value); } catch (e) { - KRLogUtil.kr_e('存储整数失败: $e', tag: 'SecureStorage'); + KRLogUtil.kr_e('❌ 存储整数失败: $e', tag: 'SecureStorage'); } } // 获取整数 Future kr_getInt({required String key}) async { try { - return _box.get(key) as int?; + final box = await _ensureBoxOpen(); + return box.get(key) as int?; } catch (e) { - KRLogUtil.kr_e('读取整数失败: $e', tag: 'SecureStorage'); + KRLogUtil.kr_e('❌ 读取整数失败: $e', tag: 'SecureStorage'); return null; } }