修改flutter兼容版本,优化macos无法切换节点和协议不兼容等问题

(cherry picked from commit dcc07886f8ba73eb2630a14a81bda191468c7a1f)
This commit is contained in:
2025-10-30 02:50:00 -07:00
committed by speakeloudest
parent 8bba2441c2
commit 064a0a7402
8 changed files with 940 additions and 555 deletions
@@ -665,6 +665,8 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
try {
kr_isSwitching = true;
KRLogUtil.kr_i('🔄 开始切换连接状态: $value', tag: 'HomeController');
if (value) {
await KRSingBoxImp.instance.kr_start();
@@ -678,16 +680,28 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
kr_forceSyncConnectionStatus();
});
} else {
await KRSingBoxImp.instance.kr_stop();
KRLogUtil.kr_i('🛑 准备停止连接...', tag: 'HomeController');
// 添加超时保护
await KRSingBoxImp.instance.kr_stop().timeout(
const Duration(seconds: 10),
onTimeout: () {
KRLogUtil.kr_e('⚠️ 停止操作超时', tag: 'HomeController');
// 强制同步状态
kr_forceSyncConnectionStatus();
throw TimeoutException('Stop operation timeout');
},
);
KRLogUtil.kr_i('✅ 停止命令已发送', tag: 'HomeController');
}
} catch (e) {
KRLogUtil.kr_e('切换失败: $e', tag: 'HomeController');
// 当启动失败时(如VPN权限被拒绝),强制同步状态
// 当启动或停止失败时,强制同步状态
Future.delayed(const Duration(milliseconds: 100), () {
kr_forceSyncConnectionStatus();
});
} finally {
// 确保在任何情况下都会重置标志
KRLogUtil.kr_i('🔓 重置切换标志', tag: 'HomeController');
kr_isSwitching = false;
}
}
@@ -1088,10 +1102,11 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
// 更新连接信息
kr_updateConnectionInfo();
// 🔧 修复:只有在核心已启动时才选择节点,避免触发重启
if (KRSingBoxImp.instance.kr_status.value == SingboxStarted()) {
KRSingBoxImp.instance.kr_selectOutbound(tag);
// 🔧 修复选择节点后启动延迟值更新带超时保护
// 🔧 修复:选择节点后启动延迟值更新(带超时保护)
Future.delayed(const Duration(milliseconds: 500), () {
if (kr_currentNodeLatency.value == -1 && kr_isConnected.value) {
KRLogUtil.kr_w('⚠️ 选择节点后延迟值未更新,尝试手动更新', tag: 'HomeController');
@@ -1101,7 +1116,13 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
}
});
} else {
KRSingBoxImp().kr_start();
// 🔧 修复:核心未启动时,仍需保存用户选择,以便启动VPN时应用
KRLogUtil.kr_i('💾 核心未启动,保存节点选择以便稍后应用: $tag', tag: 'HomeController');
KRSecureStorage().kr_saveData(key: 'SELECTED_NODE_TAG', value: tag).then((_) {
KRLogUtil.kr_i('✅ 节点选择已保存: $tag', tag: 'HomeController');
}).catchError((e) {
KRLogUtil.kr_e('❌ 保存节点选择失败: $e', tag: 'HomeController');
});
}
// 移动到选中的节点