优化核心在切换节点时候以往的浏览器保持长连接导致无法使用新节点的逻辑
(cherry picked from commit c920d9fbcd0589f1051bac5bb5bcb5f5deca1017)
This commit is contained in:
parent
f71575ee91
commit
8b982d1ba8
@ -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');
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user