修改 KRSecureStorage 类,确保每次操作前 box 都是打开状态。目前解决了从新打开app登录状态失效

(cherry picked from commit ab22be112a1753e5063799b5424f5d3feef06e2d)
This commit is contained in:
Rust 2025-11-02 04:45:25 -08:00 committed by speakeloudest
parent 7a223d614b
commit 7cd022093b
4 changed files with 65 additions and 23 deletions

View File

@ -1,5 +1,8 @@
import 'dart:async'; import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
@ -1075,7 +1078,7 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
// UI // UI
kr_cutSeletedTag.value = tag; kr_cutSeletedTag.value = tag;
kr_updateConnectionInfo(); kr_updateConnectionInfo();
kr_moveToSelectedNode(); // kr_moveToSelectedNode();
// 🚀 A增强 // 🚀 A增强
KRLogUtil.kr_i('⏳ [增强] 等待活动组更新500ms...', tag: 'HomeController'); KRLogUtil.kr_i('⏳ [增强] 等待活动组更新500ms...', tag: 'HomeController');

View File

@ -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/dialogs/hi_dialog.dart';
import 'package:kaer_with_panels/app/widgets/kr_app_text_style.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/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<KRHomeController> { class HIAnimatedConnectButton extends GetView<KRHomeController> {
@ -20,9 +22,18 @@ class HIAnimatedConnectButton extends GetView<KRHomeController> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Obx(() { return Obx(() {
final isConnected = controller.kr_isConnected.value;
final delay = controller.kr_currentNodeLatency.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 isShow = isConnected; // delay == -1 || isConnected;
final Color buttonColor = Theme.of(context).primaryColor; final Color buttonColor = Theme.of(context).primaryColor;
@ -71,6 +82,10 @@ class HIAnimatedConnectButton extends GetView<KRHomeController> {
clipBehavior: Clip.antiAlias, clipBehavior: Clip.antiAlias,
child: InkWell( child: InkWell(
onTap: () { onTap: () {
if(isSwitching) {
print('🔵 Switch UI 正在更新,切换中点击了按钮: status=${status.runtimeType}, isConnected=$isConnected, isSwitching=$isSwitching');
return;
}
final hasValidSubscription = final hasValidSubscription =
controller.kr_subscribeService.kr_availableSubscribes.isNotEmpty; controller.kr_subscribeService.kr_availableSubscribes.isNotEmpty;
if (hasValidSubscription) { if (hasValidSubscription) {

View File

@ -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/widgets/kr_local_image.dart';
import 'package:kaer_with_panels/app/utils/kr_log_util.dart'; import 'package:kaer_with_panels/app/utils/kr_log_util.dart';
import 'dart:convert'; import 'dart:convert';
import 'package:flutter_screenutil/flutter_screenutil.dart';

View File

@ -100,24 +100,38 @@ class KRSecureStorage {
return hash.bytes; return hash.bytes;
} }
// // 🔧 box
Box<dynamic> get _box => Hive.box(_boxName); Future<Box<dynamic>> _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<void> kr_saveData({required String key, required String value}) async { Future<void> kr_saveData({required String key, required String value}) async {
try { try {
await _box.put(key, value); final box = await _ensureBoxOpen();
await box.put(key, value);
KRLogUtil.kr_i('✅ 数据已保存: $key', tag: 'SecureStorage');
} catch (e) { } catch (e) {
KRLogUtil.kr_e('存储数据失败: $e', tag: 'SecureStorage'); KRLogUtil.kr_e('❌ 存储数据失败: $e', tag: 'SecureStorage');
rethrow; //
} }
} }
// //
Future<String?> kr_readData({required String key}) async { Future<String?> kr_readData({required String key}) async {
try { 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) { } catch (e) {
KRLogUtil.kr_e('读取数据失败: $e', tag: 'SecureStorage'); KRLogUtil.kr_e('读取数据失败: $e', tag: 'SecureStorage');
return null; return null;
} }
} }
@ -125,27 +139,32 @@ class KRSecureStorage {
// //
Future<void> kr_deleteData({required String key}) async { Future<void> kr_deleteData({required String key}) async {
try { try {
await _box.delete(key); final box = await _ensureBoxOpen();
await box.delete(key);
KRLogUtil.kr_i('🗑️ 数据已删除: $key', tag: 'SecureStorage');
} catch (e) { } catch (e) {
KRLogUtil.kr_e('删除数据失败: $e', tag: 'SecureStorage'); KRLogUtil.kr_e('删除数据失败: $e', tag: 'SecureStorage');
} }
} }
// //
Future<void> kr_clearAllData() async { Future<void> kr_clearAllData() async {
try { try {
await _box.clear(); final box = await _ensureBoxOpen();
await box.clear();
KRLogUtil.kr_i('🧹 所有数据已清除', tag: 'SecureStorage');
} catch (e) { } catch (e) {
KRLogUtil.kr_e('清除数据失败: $e', tag: 'SecureStorage'); KRLogUtil.kr_e('清除数据失败: $e', tag: 'SecureStorage');
} }
} }
// //
Future<bool> kr_hasKey({required String key}) async { Future<bool> kr_hasKey({required String key}) async {
try { try {
return _box.containsKey(key); final box = await _ensureBoxOpen();
return box.containsKey(key);
} catch (e) { } catch (e) {
KRLogUtil.kr_e('检查键失败: $e', tag: 'SecureStorage'); KRLogUtil.kr_e('检查键失败: $e', tag: 'SecureStorage');
return false; return false;
} }
} }
@ -153,18 +172,20 @@ class KRSecureStorage {
// //
Future<void> kr_saveBool({required String key, required bool value}) async { Future<void> kr_saveBool({required String key, required bool value}) async {
try { try {
await _box.put(key, value); final box = await _ensureBoxOpen();
await box.put(key, value);
} catch (e) { } catch (e) {
KRLogUtil.kr_e('存储布尔值失败: $e', tag: 'SecureStorage'); KRLogUtil.kr_e('存储布尔值失败: $e', tag: 'SecureStorage');
} }
} }
// //
Future<bool?> kr_getBool({required String key}) async { Future<bool?> kr_getBool({required String key}) async {
try { try {
return _box.get(key) as bool?; final box = await _ensureBoxOpen();
return box.get(key) as bool?;
} catch (e) { } catch (e) {
KRLogUtil.kr_e('读取布尔值失败: $e', tag: 'SecureStorage'); KRLogUtil.kr_e('读取布尔值失败: $e', tag: 'SecureStorage');
return null; return null;
} }
} }
@ -172,18 +193,20 @@ class KRSecureStorage {
// //
Future<void> kr_saveInt({required String key, required int value}) async { Future<void> kr_saveInt({required String key, required int value}) async {
try { try {
await _box.put(key, value); final box = await _ensureBoxOpen();
await box.put(key, value);
} catch (e) { } catch (e) {
KRLogUtil.kr_e('存储整数失败: $e', tag: 'SecureStorage'); KRLogUtil.kr_e('存储整数失败: $e', tag: 'SecureStorage');
} }
} }
// //
Future<int?> kr_getInt({required String key}) async { Future<int?> kr_getInt({required String key}) async {
try { try {
return _box.get(key) as int?; final box = await _ensureBoxOpen();
return box.get(key) as int?;
} catch (e) { } catch (e) {
KRLogUtil.kr_e('读取整数失败: $e', tag: 'SecureStorage'); KRLogUtil.kr_e('读取整数失败: $e', tag: 'SecureStorage');
return null; return null;
} }
} }