feat: 1.调整项目初始化,不用等待site/config接口,仅在hi_user_info中调用;将site_config_service拆成loadDomain和获取配置,在splash中只做loadDomain

2. 优化接口拦截的解密日志
3. 调整获取订阅到kr_home,与源版一致
4. 修复闪连抖动问题,增加套餐有效期判断
This commit is contained in:
2026-01-13 18:07:11 -08:00
parent 1d2a89a80a
commit ccf9a76de9
22 changed files with 737 additions and 1379 deletions
@@ -33,9 +33,6 @@ import 'package:kaer_with_panels/app/services/singbox_imp/kr_sing_box_imp.dart';
import 'package:flutter/foundation.dart';
import 'package:kaer_with_panels/app/utils/kr_init_log_collector.dart'; // 🔧 新增:导入日志收集器
import 'package:kaer_with_panels/app/utils/kr_latency_tester.dart'; // 🔧 新增:导入真实延迟测试工具
import 'package:kaer_with_panels/app/utils/account_guard.dart';
import 'package:kaer_with_panels/app/services/iap/iap_service.dart';
class KRHomeController extends GetxController with WidgetsBindingObserver {
// 🔧 新增:日志收集器实例
@@ -44,7 +41,6 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
/// 订阅服务
final KRSubscribeService kr_subscribeService = KRSubscribeService();
/// 当前视图状态,登录状态
final Rx<KRHomeViewsStatus> kr_currentViewStatus =
KRHomeViewsStatus.kr_notLoggedIn.obs;
@@ -52,25 +48,6 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
/// 当前列表视图状态
final kr_currentListStatus = KRHomeViewsListStatus.kr_loading.obs;
/// 底部面板高度常量
static const double kr_baseHeight = 120.0; // 基础高度(连接选项)
static const double kr_subscriptionCardHeight = 200.0; // 订阅卡片高度
static const double kr_connectionInfoHeight = 126.0; // 连接信息卡片高度(修复后)
static const double kr_trialCardHeight = 120.0; // 试用卡片高度
static const double kr_lastDayCardHeight = 120.0; // 最后一天卡片高度
static const double kr_nodeListHeight = 400.0; // 节点列表高度
static const double kr_errorHeight = 100.0; // 错误状态高度
static const double kr_loadingHeight = 100.0; // 加载状态高度
/// 间距常量
static const double kr_marginTop = 12.0; // 顶部间距
static const double kr_marginBottom = 12.0; // 底部间距
static const double kr_marginHorizontal = 16.0; // 水平间距
static const double kr_marginVertical = 12.0; // 垂直间距
/// 底部面板高度
final kr_bottomPanelHeight = 200.0.obs;
/// 连接字符串
final kr_connectText = AppTranslations.kr_home.disconnected.obs;
@@ -223,6 +200,23 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
return;
}
final current = kr_subscribeService.kr_currentSubscribe.value;
if (!KRAppRunData.getInstance().kr_isLogin.value || current == null) {
KRLogUtil.kr_w('未登录或无可用订阅,阻止自动连接', tag: 'QuickConnect');
return;
}
bool isExpired = false;
if (current.expireTime.isNotEmpty) {
try {
isExpired =
DateTime.parse(current.expireTime).isBefore(DateTime.now());
} catch (_) {}
}
if (isExpired) {
KRLogUtil.kr_w('订阅不可用(过期或流量耗尽),阻止自动连接', tag: 'QuickConnect');
return;
}
await _kr_prepareCountrySelectionBeforeStart();
final selectedAfter =
await KRSecureStorage().kr_readData(key: 'SELECTED_NODE_TAG');
@@ -260,45 +254,9 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
}
}
/// 检查是否满足自动连接条件(不执行连接)
bool canAutoConnect() {
return isQuickConnectEnabled.value &&
KRAppRunData.getInstance().kr_isLogin.value &&
!kr_isConnected.value;
}
@override
void onInit() async {
super.onInit();
// 🔧 紧急诊断:直接写文件验证 onInit 是否被调用
try {
final dir = await getApplicationDocumentsDirectory();
final debugFile = File('${dir.path}/HOME_CONTROLLER_DEBUG.txt');
await debugFile.writeAsString(
'=' * 60 +
'\n'
'HomeController.onInit 被调用!\n'
'时间: ${DateTime.now()}\n'
'实例 HashCode: ${hashCode}\n'
'线程: ${Platform.isAndroid ? "Android" : "Unknown"}\n'
'=' *
60 +
'\n',
mode: FileMode.append,
);
} catch (e) {
// 忽略错误,确保不影响主流程
}
// 🔧 新增:记录 HomeController 初始化开始
_initLog.logPhaseStart('HomeController 初始化');
_initLog.log('KRHomeController.onInit 被调用', tag: 'Home');
// 🔧 Android 15 紧急修复:立即设置默认高度,确保底部面板可见
// kr_updateBottomPanelHeight();
/// 底部面板高度处理
// _kr_initBottomPanelHeight();
// 加载闪连状态
_loadQuickConnectStatus();
// 加载已选择的国家
@@ -320,7 +278,7 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
// 延迟同步连接状态,确保状态正确
Future.delayed(const Duration(milliseconds: 500), () {
kr_forceSyncConnectionStatus(true);
kr_forceSyncConnectionStatus();
});
// 🔧 Android 15 新增:5秒后再次强制更新高度,兜底保护
@@ -372,14 +330,6 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
} catch (_) {}
}
/// 底部面板高度处理
void _kr_initBottomPanelHeight() {
ever(kr_currentListStatus, (status) {
kr_updateBottomPanelHeight();
KRLogUtil.kr_i(status.toString(), tag: "_kr_initBottomPanelHeight");
});
}
void _kr_initLoginStatus() {
_initLog.log('开始初始化登录状态处理', tag: 'Home');
KRLogUtil.kr_i('初始化登录状态', tag: 'HomeController');
@@ -392,10 +342,7 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
KRLogUtil.kr_w('⏱️ 订阅服务初始化超时(8秒),强制设置为无数据状态', tag: 'HomeController');
// 🔧 Android 15 优化:超时设置为 none 而非 error,避免底部面板显示错误界面
kr_currentListStatus.value = KRHomeViewsListStatus.kr_none;
// 强制更新底部面板高度,确保显示正常
kr_updateBottomPanelHeight();
_initLog.log('已强制切换到默认视图, 底部面板高度: ${kr_bottomPanelHeight.value}',
tag: 'Subscribe');
KRLogUtil.kr_i('✅ 已强制切换到默认视图', tag: 'HomeController');
}
});
@@ -458,8 +405,7 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
kr_currentViewStatus.value = KRHomeViewsStatus.kr_loggedIn;
_initLog.logSuccess('用户已登录,准备加载订阅数据', tag: 'Home');
KRLogUtil.kr_i('设置为已登录状态', tag: 'HomeController');
// 订阅服务已在 splash 页面初始化,此处无需重复初始化
_kr_ensureSubscribeServiceInitialized();
KRLogUtil.kr_i('订阅服务已在启动页初始化,跳过重复初始化', tag: 'HomeController');
} else {
kr_currentViewStatus.value = KRHomeViewsStatus.kr_notLoggedIn;
@@ -517,6 +463,7 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
throw TimeoutException('订阅服务初始化超时');
},
).then((_) async {
_checkQuickConnectAutoStart();
final elapsed = DateTime.now().difference(startTime).inMilliseconds;
_initLog.logSuccess('订阅服务初始化完成, 耗时: ${elapsed}ms', tag: 'Subscribe');
_initLog.log('最终列表状态: ${kr_currentListStatus.value}',
@@ -594,7 +541,6 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
kr_currentViewStatus.value = KRHomeViewsStatus.kr_loggedIn;
KRLogUtil.kr_i('登录状态变化:设置为已登录', tag: 'HomeController');
// 订阅服务已在 splash 页面初始化,此处无需重复初始化
KRLogUtil.kr_i('订阅服务已在启动页初始化,跳过重复初始化', tag: 'HomeController');
} else {
@@ -681,7 +627,6 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
} else {
// kr_updateBottomPanelHeight();
}
_checkQuickConnectAutoStart();
_kr_testLatencyWithoutVpn();
break;
case KRSubscribeServiceStatus.kr_none:
@@ -1872,18 +1817,6 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
@override
void onReady() {
super.onReady();
Future.delayed(const Duration(milliseconds: 200), () async {
ensureAccountExists().then((ok) {
print('ok');
});
});
Future.delayed(const Duration(milliseconds: 500), () async {
if (Get.isRegistered<KRIAPService>()) {
KRIAPService.instance.setup();
}
});
}
@override
@@ -1958,100 +1891,8 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
});
}
// 更新底部面板高度
void kr_updateBottomPanelHeight() {
// 🔧 Android 15 优化:加载状态时也允许更新高度,显示加载指示器
if (kr_subscribeService.kr_currentStatus ==
KRHomeViewsListStatus.kr_loading &&
kr_currentListStatus.value != KRHomeViewsListStatus.kr_loading) {
return;
}
KRLogUtil.kr_i('更新底部面板高度', tag: 'HomeController');
KRLogUtil.kr_i('当前视图状态: ${kr_currentViewStatus.value}',
tag: 'HomeController');
KRLogUtil.kr_i('当前列表状态: ${kr_currentListStatus.value}',
tag: 'HomeController');
KRLogUtil.kr_i('是否试用: ${kr_subscribeService.kr_isTrial.value}',
tag: 'HomeController');
KRLogUtil.kr_i(
'是否最后一天: ${kr_subscribeService.kr_isLastDayOfSubscription.value}',
tag: 'HomeController');
double targetHeight = 0.0;
if (kr_currentViewStatus.value == KRHomeViewsStatus.kr_notLoggedIn) {
// 未登录状态下,高度由内容撑开
targetHeight = kr_subscriptionCardHeight +
kr_baseHeight +
kr_marginTop +
kr_marginBottom +
kr_marginVertical * 2;
KRLogUtil.kr_i('未登录状态,目标高度: $targetHeight', tag: 'HomeController');
} else if (kr_currentListStatus.value ==
KRHomeViewsListStatus.kr_serverList ||
kr_currentListStatus.value ==
KRHomeViewsListStatus.kr_countrySubscribeList ||
kr_currentListStatus.value ==
KRHomeViewsListStatus.kr_serverSubscribeList ||
kr_currentListStatus.value == KRHomeViewsListStatus.kr_subscribeList) {
targetHeight = kr_nodeListHeight + kr_marginVertical * 2;
KRLogUtil.kr_i('节点列表状态,目标高度: $targetHeight', tag: 'HomeController');
}
// 🔧 Android 15 新增:处理加载和错误状态
else if (kr_currentListStatus.value == KRHomeViewsListStatus.kr_loading ||
kr_currentListStatus.value == KRHomeViewsListStatus.kr_error) {
// 加载或错误状态下显示最小高度
targetHeight = kr_loadingHeight + kr_marginTop + kr_marginBottom;
KRLogUtil.kr_i('加载/错误状态,目标高度: $targetHeight', tag: 'HomeController');
} else {
// 已登录状态下的默认高度计算
targetHeight = kr_baseHeight + kr_marginTop + kr_marginBottom;
KRLogUtil.kr_i('基础高度: $targetHeight', tag: 'HomeController');
// 🔧 关键修复:增加防御性检查,确保订阅服务访问异常时高度计算仍正常
try {
if (kr_subscribeService.kr_currentSubscribe.value != null) {
targetHeight += kr_connectionInfoHeight + kr_marginTop;
KRLogUtil.kr_i('添加连接信息卡片高度: $targetHeight', tag: 'HomeController');
} else {
targetHeight += kr_subscriptionCardHeight + kr_marginTop;
KRLogUtil.kr_i('添加订阅卡片高度: $targetHeight', tag: 'HomeController');
}
// 如果有试用状态,添加试用卡片高度
if (kr_subscribeService.kr_isTrial.value) {
targetHeight += kr_trialCardHeight + kr_marginTop;
KRLogUtil.kr_i('添加试用卡片高度: $targetHeight', tag: 'HomeController');
}
// 如果是最后一天,添加最后一天卡片高度
else if (kr_subscribeService.kr_isLastDayOfSubscription.value) {
targetHeight += kr_lastDayCardHeight + kr_marginTop;
KRLogUtil.kr_i('添加最后一天卡片高度: $targetHeight', tag: 'HomeController');
}
} catch (e) {
// 🔧 修复:订阅服务访问异常时,使用默认订阅卡片高度
KRLogUtil.kr_e('访问订阅服务数据异常,使用默认高度: $e', tag: 'HomeController');
targetHeight += kr_subscriptionCardHeight + kr_marginTop;
KRLogUtil.kr_i('使用默认订阅卡片高度: $targetHeight', tag: 'HomeController');
}
}
// 🔧 Android 15 优化:确保最小高度,避免出现 0 高度
if (targetHeight < 100) {
KRLogUtil.kr_w('计算的高度过小($targetHeight),设置为最小高度', tag: 'HomeController');
targetHeight = kr_loadingHeight;
}
KRLogUtil.kr_i('最终目标高度: $targetHeight', tag: 'HomeController');
kr_bottomPanelHeight.value = targetHeight;
}
// 移动到选中节点
void kr_moveToSelectedNode() {
}
void kr_moveToSelectedNode() {}
// 简化移动地图方法
void kr_moveToLocation() {
@@ -2436,7 +2277,7 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
}
/// 强制同步连接状态
void kr_forceSyncConnectionStatus([bool? isQuickConnect]) {
void kr_forceSyncConnectionStatus() {
try {
KRLogUtil.kr_i('🔄 强制同步连接状态...', tag: 'HomeController');
@@ -2479,10 +2320,6 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
// 强制更新UI
update();
print('isQuickConnect$isQuickConnect');
if (isQuickConnect == true) {
_checkQuickConnectAutoStart();
}
KRLogUtil.kr_i('✅ 连接状态同步完成', tag: 'HomeController');
} catch (e) {
KRLogUtil.kr_e('❌ 强制同步连接状态失败: $e', tag: 'HomeController');