From 8b982d1ba8637672d8504a7db2057de5e2dcbbc6 Mon Sep 17 00:00:00 2001 From: Rust Date: Sat, 1 Nov 2025 15:59:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=A0=B8=E5=BF=83=E5=9C=A8?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E8=8A=82=E7=82=B9=E6=97=B6=E5=80=99=E4=BB=A5?= =?UTF-8?q?=E5=BE=80=E7=9A=84=E6=B5=8F=E8=A7=88=E5=99=A8=E4=BF=9D=E6=8C=81?= =?UTF-8?q?=E9=95=BF=E8=BF=9E=E6=8E=A5=E5=AF=BC=E8=87=B4=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=96=B0=E8=8A=82=E7=82=B9=E7=9A=84=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit c920d9fbcd0589f1051bac5bb5bcb5f5deca1017) --- .../controllers/kr_home_controller.dart | 34 +++++++++++++++---- 1 file changed, 27 insertions(+), 7 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 3679374..6813af2 100755 --- a/lib/app/modules/kr_home/controllers/kr_home_controller.dart +++ b/lib/app/modules/kr_home/controllers/kr_home_controller.dart @@ -988,9 +988,9 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { return true; } - // 4. VPN已连接,需要通知后台进行节点切换 + // 4. VPN已连接,需要重启VPN以断开现有连接并应用新节点 try { - KRLogUtil.kr_i('🔌 VPN已连接,开始切换后台节点: $tag', tag: 'HomeController'); + KRLogUtil.kr_i('🔌 VPN已连接,将重启VPN以断开现有连接: $tag', tag: 'HomeController'); // 🔧 诊断:打印当前活动组信息 KRLogUtil.kr_i('📊 当前活动组数量: ${KRSingBoxImp.instance.kr_activeGroups.length}', tag: 'HomeController'); @@ -1007,10 +1007,23 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { kr_currentNodeLatency.value = -1; kr_isLatency.value = true; // 显示加载动画 - // 等待后台节点切换完成(关键!) - KRLogUtil.kr_i('⏳ 调用 kr_selectOutbound($tag),等待完成...', tag: 'HomeController'); - await KRSingBoxImp.instance.kr_selectOutbound(tag); - KRLogUtil.kr_i('✅ kr_selectOutbound 完成,开始更新 UI', tag: 'HomeController'); + // 🔧 关键修复:保存新节点选择 + KRLogUtil.kr_i('💾 保存新节点选择: $tag', tag: 'HomeController'); + await KRSecureStorage().kr_saveData(key: 'SELECTED_NODE_TAG', value: tag); + + // 🔧 关键修复:重启VPN连接以断开所有现有长连接 + KRLogUtil.kr_i('🔄 停止VPN连接以断开现有连接...', tag: 'HomeController'); + await KRSingBoxImp.instance.kr_stop(); // 先停止VPN + + KRLogUtil.kr_i('⏳ 等待VPN完全停止...', tag: 'HomeController'); + await Future.delayed(const Duration(milliseconds: 800)); // 等待停止完成 + + KRLogUtil.kr_i('🔄 启动VPN并应用新节点: $tag', tag: 'HomeController'); + await KRSingBoxImp.instance.kr_start(); // 重新启动VPN,会自动使用新保存的节点 + + // 等待VPN启动完成 + KRLogUtil.kr_i('⏳ 等待VPN启动完成...', tag: 'HomeController'); + await Future.delayed(const Duration(milliseconds: 1500)); // 等待启动完成 // 后台切换成功,更新UI kr_cutSeletedTag.value = tag; @@ -1022,7 +1035,7 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { await Future.delayed(const Duration(milliseconds: 200)); // 等待活动组更新 _kr_updateLatencyOnConnected(); - KRLogUtil.kr_i('✅ 节点切换成功: $tag', tag: 'HomeController'); + KRLogUtil.kr_i('✅ 节点切换成功(已重启VPN断开旧连接): $tag', tag: 'HomeController'); return true; } catch (switchError) { @@ -1034,6 +1047,13 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { kr_currentNodeName.value = originalTag; // 🔧 修复:同时恢复节点名称显示 kr_currentNodeLatency.value = -2; // 恢复为未连接状态 + // 恢复原节点选择 + try { + await KRSecureStorage().kr_saveData(key: 'SELECTED_NODE_TAG', value: originalTag); + } catch (e) { + KRLogUtil.kr_e('❌ 恢复节点选择失败: $e', tag: 'HomeController'); + } + // 显示错误提示给用户 KRCommonUtil.kr_showToast('节点切换失败,已恢复为: $originalTag');