feat: 保存节点调试进度
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
// hi_node_list_view.dart
|
||||
|
||||
import 'dart:math';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
@@ -80,8 +79,8 @@ class HINodeListView extends GetView<HINodeListController> {
|
||||
// 并设置透明背景,让父组件的背景可以透出来
|
||||
return Material(
|
||||
color: Colors.transparent,
|
||||
child: _buildSubscribeList(context)
|
||||
// child: _kr_buildRegionList(context)
|
||||
// child: _buildSubscribeList(context)
|
||||
child: _kr_buildRegionList(context)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -109,7 +108,7 @@ class HINodeListView extends GetView<HINodeListController> {
|
||||
onTap: () async {
|
||||
try {
|
||||
final success =
|
||||
await controller.homeController.kr_performCountrySwitch('auto');
|
||||
await controller.homeController.kr_performNodeSwitch('auto');
|
||||
if (success) {
|
||||
controller.homeController.kr_currentListStatus.value =
|
||||
KRHomeViewsListStatus.kr_none;
|
||||
@@ -193,8 +192,10 @@ class HINodeListView extends GetView<HINodeListController> {
|
||||
return InkWell(
|
||||
onTap: () async {
|
||||
try {
|
||||
|
||||
final success =
|
||||
await controller.homeController.kr_performCountrySwitch(country.country);
|
||||
await controller.homeController.kr_performNodeSwitch('${country.country}-auto');
|
||||
print('node 点击 ${country.country} 节点数量${country.outboundList.length} 节点详情 ${country.outboundList}');
|
||||
if (success) {
|
||||
controller.homeController.kr_currentListStatus.value =
|
||||
KRHomeViewsListStatus.kr_none;
|
||||
@@ -311,7 +312,23 @@ class HINodeListView extends GetView<HINodeListController> {
|
||||
),
|
||||
...controller.kr_subscribeService.allList.map((item) {
|
||||
return InkWell(
|
||||
onTap: () => _onNodeSelected(item),
|
||||
// 🔧 修复:改为 async,等待节点切换完成后再关闭列表
|
||||
onTap: () async {
|
||||
try {
|
||||
KRLogUtil.kr_i(
|
||||
'🔄 用户点击节点: ${item.tag}');
|
||||
final success = await controller.homeController
|
||||
.kr_performNodeSwitch(item.tag);
|
||||
if (success) {
|
||||
controller.homeController.kr_currentListStatus.value =
|
||||
KRHomeViewsListStatus.kr_none;
|
||||
}
|
||||
} catch (e) {
|
||||
KRLogUtil.kr_e(
|
||||
'节点切换异常: $e',
|
||||
tag: 'NodeListView');
|
||||
}
|
||||
},
|
||||
child: _kr_buildNodeListItem(context, item: item),
|
||||
);
|
||||
}).toList(),
|
||||
@@ -524,7 +541,7 @@ class HINodeListView extends GetView<HINodeListController> {
|
||||
);
|
||||
}),
|
||||
SizedBox(width: 12.w),
|
||||
Obx(() => controller.homeController.kr_coutryText.value == country.country
|
||||
Obx(() => controller.homeController.kr_cutTag.value == '${country.country}-auto'
|
||||
? KrLocalImage(
|
||||
imageName: 'radio-active-icon',
|
||||
imageType: ImageType.svg,
|
||||
|
||||
@@ -1276,107 +1276,6 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
|
||||
}
|
||||
}
|
||||
|
||||
/// 🌍 执行国家切换(包含UI同步与VPN热重载)
|
||||
/// 返回 true 表示切换成功,false 表示失败
|
||||
Future<bool> kr_performCountrySwitch(String countryTag) async {
|
||||
try {
|
||||
KRLogUtil.kr_i('🔄 开始切换国家: $countryTag', tag: 'HomeController');
|
||||
|
||||
// 1. 保存原国家,以备失败恢复
|
||||
final originalCountry = kr_coutryText.value;
|
||||
|
||||
// 2. 设置切换中状态
|
||||
kr_coutryText.value = countryTag;
|
||||
kr_currentNodeName.value = countryTag; // UI显示当前国家
|
||||
|
||||
// 3. 获取该国家的节点列表
|
||||
final countryData = kr_subscribeService.countryOutboundList
|
||||
.firstWhereOrNull((c) => c.country.toUpperCase() == countryTag.toUpperCase());
|
||||
|
||||
if (countryData == null || countryData.outboundList.isEmpty) {
|
||||
KRLogUtil.kr_w('⚠️ 未找到国家 [$countryTag] 的节点列表', tag: 'HomeController');
|
||||
KRCommonUtil.kr_showToast('该国家暂无可用节点');
|
||||
return false;
|
||||
}
|
||||
|
||||
// 取第一个节点作为默认节点(后续由 sing-box 自动在该组内切换)
|
||||
final defaultNode = countryData.outboundList.first.tag;
|
||||
KRLogUtil.kr_i(
|
||||
'📊 国家 [$countryTag] 包含 ${countryData.outboundList.length} 个节点,默认节点: $defaultNode',
|
||||
tag: 'HomeController',
|
||||
);
|
||||
|
||||
// 4. 如果VPN未连接,只更新UI变量即可
|
||||
if (!kr_isConnected.value) {
|
||||
KRLogUtil.kr_i('📴 VPN未连接,只更新UI变量: $countryTag', tag: 'HomeController');
|
||||
kr_cutSeletedTag.value = defaultNode;
|
||||
kr_cutTag.value = defaultNode;
|
||||
kr_currentNodeLatency.value = -2;
|
||||
|
||||
// 保存国家选择与默认节点
|
||||
await KRSecureStorage().kr_saveData(key: 'SELECTED_COUNTRY_TAG', value: countryTag);
|
||||
await KRSecureStorage().kr_saveData(key: 'SELECTED_NODE_TAG', value: defaultNode);
|
||||
|
||||
KRLogUtil.kr_i('✅ 已保存国家选择 [$countryTag] (未连接状态)', tag: 'HomeController');
|
||||
return true;
|
||||
}
|
||||
|
||||
// 5. VPN已连接状态,执行完整重载逻辑
|
||||
try {
|
||||
KRLogUtil.kr_i('🔌 VPN已连接,准备切换国家 [$countryTag]', tag: 'HomeController');
|
||||
|
||||
// 显示连接中
|
||||
kr_currentNodeLatency.value = -1;
|
||||
kr_isLatency.value = true;
|
||||
|
||||
// 保存选择
|
||||
await KRSecureStorage().kr_saveData(key: 'SELECTED_COUNTRY_TAG', value: countryTag);
|
||||
await KRSecureStorage().kr_saveData(key: 'SELECTED_NODE_TAG', value: defaultNode);
|
||||
|
||||
// 🔧 调用 SingBox 层逻辑切换国家分组(稍后在 kr_sing_box_imp.dart 实现)
|
||||
KRLogUtil.kr_i('🧩 调用 sing-box 切换国家分组逻辑: $countryTag', tag: 'HomeController');
|
||||
await KRSingBoxImp.instance.kr_selectCountry(countryTag);
|
||||
|
||||
// 🔁 停止并重启 VPN
|
||||
await KRSingBoxImp.instance.kr_stop();
|
||||
KRLogUtil.kr_i('⏳ 等待VPN停止(1500ms)', tag: 'HomeController');
|
||||
await Future.delayed(const Duration(milliseconds: 1500));
|
||||
|
||||
await KRSingBoxImp.instance.kr_start();
|
||||
KRLogUtil.kr_i('⏳ 等待VPN启动(2500ms)', tag: 'HomeController');
|
||||
await Future.delayed(const Duration(milliseconds: 2500));
|
||||
|
||||
// ✅ 切换成功,更新UI
|
||||
kr_cutSeletedTag.value = defaultNode;
|
||||
kr_cutTag.value = defaultNode;
|
||||
kr_updateConnectionInfo();
|
||||
|
||||
// 更新延迟信息
|
||||
_kr_updateLatencyOnConnected();
|
||||
|
||||
KRLogUtil.kr_i('✅ 国家切换成功: $countryTag', tag: 'HomeController');
|
||||
return true;
|
||||
} catch (switchError) {
|
||||
KRLogUtil.kr_e('❌ 国家切换失败: $switchError', tag: 'HomeController');
|
||||
|
||||
// 恢复原国家状态
|
||||
kr_coutryText.value = originalCountry;
|
||||
await KRSecureStorage().kr_saveData(key: 'SELECTED_COUNTRY_TAG', value: originalCountry ?? '');
|
||||
|
||||
KRCommonUtil.kr_showToast('切换国家失败,已恢复为: ${originalCountry ?? "无"}');
|
||||
return false;
|
||||
}
|
||||
} catch (e) {
|
||||
KRLogUtil.kr_e('❌ 国家切换异常: $e', tag: 'HomeController');
|
||||
KRCommonUtil.kr_showToast('国家切换异常,请重试');
|
||||
return false;
|
||||
} finally {
|
||||
kr_isLatency.value = false;
|
||||
KRLogUtil.kr_i('🔄 国家切换流程完成', tag: 'HomeController');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// 🔧 修复:简化的 kr_selectNode 方法
|
||||
/// 现在只是委托给新的 kr_performNodeSwitch 方法
|
||||
|
||||
Reference in New Issue
Block a user