修正切换和国旗问题
(cherry picked from commit bec2464da85e981636077276de36b2ea5f6c40f4)
This commit is contained in:
@@ -656,6 +656,51 @@ class KRSingBoxImp {
|
||||
);
|
||||
}
|
||||
|
||||
/// 验证节点选择是否生效
|
||||
///
|
||||
/// 检查活动组中 "select" 组的 selected 字段是否是目标节点
|
||||
Future<void> _kr_verifyNodeSelection(String targetTag) async {
|
||||
try {
|
||||
KRLogUtil.kr_i('🔍 开始验证节点选择: $targetTag', tag: 'SingBox');
|
||||
|
||||
// 查找 "select" 组
|
||||
final selectGroup = kr_activeGroups.firstWhere(
|
||||
(group) => group.tag == 'select',
|
||||
orElse: () => throw Exception('未找到 "select" 选择器组'),
|
||||
);
|
||||
|
||||
KRLogUtil.kr_i('📊 Select 组状态:', tag: 'SingBox');
|
||||
KRLogUtil.kr_i(' - 组标签: ${selectGroup.tag}', tag: 'SingBox');
|
||||
KRLogUtil.kr_i(' - 组类型: ${selectGroup.type}', tag: 'SingBox');
|
||||
KRLogUtil.kr_i(' - 当前选中: ${selectGroup.selected}', tag: 'SingBox');
|
||||
KRLogUtil.kr_i(' - 目标节点: $targetTag', tag: 'SingBox');
|
||||
KRLogUtil.kr_i(' - 可用节点数: ${selectGroup.items.length}', tag: 'SingBox');
|
||||
|
||||
// 验证目标节点是否在可用列表中
|
||||
final hasTarget = selectGroup.items.any((item) => item.tag == targetTag);
|
||||
if (!hasTarget) {
|
||||
KRLogUtil.kr_w('⚠️ 目标节点不在 select 组的可用列表中: $targetTag', tag: 'SingBox');
|
||||
KRLogUtil.kr_w('可用节点列表:', tag: 'SingBox');
|
||||
for (var item in selectGroup.items) {
|
||||
KRLogUtil.kr_w(' - ${item.tag}', tag: 'SingBox');
|
||||
}
|
||||
}
|
||||
|
||||
// 检查是否切换成功
|
||||
if (selectGroup.selected != targetTag) {
|
||||
KRLogUtil.kr_e('❌ 节点切换验证失败!', tag: 'SingBox');
|
||||
KRLogUtil.kr_e(' - 期望: $targetTag', tag: 'SingBox');
|
||||
KRLogUtil.kr_e(' - 实际: ${selectGroup.selected}', tag: 'SingBox');
|
||||
throw Exception('节点切换失败:实际选中 ${selectGroup.selected},期望 $targetTag');
|
||||
}
|
||||
|
||||
KRLogUtil.kr_i('✅ 节点切换验证成功: ${selectGroup.selected} == $targetTag', tag: 'SingBox');
|
||||
} catch (e) {
|
||||
KRLogUtil.kr_e('❌ 节点验证异常: $e', tag: 'SingBox');
|
||||
// 不抛出异常,只记录日志,避免阻塞流程
|
||||
}
|
||||
}
|
||||
|
||||
/// 带重试机制的节点选择
|
||||
///
|
||||
/// 确保 command.sock 准备好后再执行节点选择
|
||||
@@ -1345,7 +1390,13 @@ class KRSingBoxImp {
|
||||
// 🔧 关键修复:使用 await 等待节点选择完成
|
||||
KRLogUtil.kr_i('⏳ 调用 selectOutbound("select", "$tag")...', tag: 'SingBox');
|
||||
await _kr_selectOutboundWithRetry("select", tag, maxAttempts: 3, initialDelay: 50);
|
||||
KRLogUtil.kr_i('✅ 节点切换完成: $tag', tag: 'SingBox');
|
||||
KRLogUtil.kr_i('✅ 节点切换API调用完成: $tag', tag: 'SingBox');
|
||||
|
||||
// 🔧 新增:验证节点切换是否生效
|
||||
await Future.delayed(const Duration(milliseconds: 300)); // 等待活动组更新
|
||||
await _kr_verifyNodeSelection(tag);
|
||||
|
||||
KRLogUtil.kr_i('✅ 节点切换验证完成: $tag', tag: 'SingBox');
|
||||
} catch (e) {
|
||||
KRLogUtil.kr_e('❌ 节点选择失败: $e', tag: 'SingBox');
|
||||
rethrow; // 抛出异常,让调用者知道失败了
|
||||
|
||||
Reference in New Issue
Block a user