feat: 1.调整项目初始化,不用等待site/config接口,仅在hi_user_info中调用;将site_config_service拆成loadDomain和获取配置,在splash中只做loadDomain
2. 优化接口拦截的解密日志 3. 调整获取订阅到kr_home,与源版一致 4. 修复闪连抖动问题,增加套餐有效期判断
This commit is contained in:
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user