新增编译模式下对日志进行输出,并且更新了hive缓存取出后进行连通性判断
Build Android APK / 编译 libcore.aar (push) Has been cancelled
Build Android APK / 编译 Android APK (release) (push) Has been cancelled
Build Android APK / 创建 GitHub Release (push) Has been cancelled
Build Multi-Platform / 编译 libcore (iOS/tvOS) (push) Has been cancelled
Build Multi-Platform / 编译 libcore (Android) (push) Has been cancelled
Build Multi-Platform / 编译 libcore (Windows) (push) Has been cancelled
Build Multi-Platform / 编译 libcore (macOS) (push) Has been cancelled
Build Multi-Platform / 编译 libcore (Linux) (push) Has been cancelled
Build Multi-Platform / 构建 Android APK (push) Has been cancelled
Build Multi-Platform / 构建 Windows (push) Has been cancelled
Build Multi-Platform / 构建 macOS (push) Has been cancelled
Build Multi-Platform / 构建 Linux (push) Has been cancelled
Build Multi-Platform / 构建 iOS (push) Has been cancelled
Build Multi-Platform / 创建 Release (push) Has been cancelled
Build Windows / 编译 libcore (Windows) (push) Has been cancelled
Build Windows / build (push) Has been cancelled

(cherry picked from commit 40f95d0c463c31428c5f25118f59b0c3a60e73ba)
This commit is contained in:
2025-11-01 08:51:11 -07:00
committed by speakeloudest
parent 4c5763647d
commit 2b80fcba0d
6 changed files with 466 additions and 119 deletions
@@ -27,8 +27,12 @@ import 'package:kaer_with_panels/app/localization/app_translations.dart';
import 'package:kaer_with_panels/app/modules/kr_home/controllers/kr_home_controller.dart';
import 'package:kaer_with_panels/app/modules/kr_home/models/kr_home_views_status.dart';
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:kaer_with_panels/app/utils/kr_init_log_collector.dart';
class KRSplashController extends GetxController {
// 🔧 新增:初始化日志收集器
final _initLog = KRInitLogCollector();
// 加载状态
final RxBool kr_isLoading = true.obs;
@@ -86,9 +90,35 @@ class KRSplashController extends GetxController {
KRLogUtil.kr_i('🌐 后台任务:网站配置和设备登录', tag: 'SplashController');
_kr_initSiteConfig(); // 不等待完成,在后台执行
// 立即开始主初始化流程
print('🔧 立即开始主初始化流程...');
_kr_initialize();
// 🔧 关键修复:先初始化日志收集器,再开始主流程
if (kDebugMode) {
print('🔧 初始化日志收集器...');
}
_initializeAndStart();
}
/// 🔧 新增:初始化日志收集器并启动主流程
Future<void> _initializeAndStart() async {
try {
// 等待日志收集器初始化完成
await _initLog.initialize();
_initLog.logPhaseStart('应用启动');
_initLog.log('KRSplashController.onInit 被调用', tag: 'Splash');
if (kDebugMode) {
print('✅ 日志收集器初始化完成');
print('🔧 立即开始主初始化流程...');
}
// 开始主初始化流程
_kr_initialize();
} catch (e) {
if (kDebugMode) {
print('❌ 日志收集器初始化失败: $e,继续执行主流程');
}
// 即使日志收集器失败,也要继续主流程
_kr_initialize();
}
}
// 记录步骤耗时的辅助方法
@@ -116,11 +146,11 @@ class KRSplashController extends GetxController {
KRLogUtil.kr_i('[SPLASH_TIMING] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'SplashController');
try {
// 🔧 P2优化:为后台任务添加10秒超时保护
// 🔧 Android 15 优化:延长超时保护到25秒,匹配网络请求超时(20秒 + 5秒缓冲)
await Future.any([
_executeSiteConfigInit(),
Future.delayed(const Duration(seconds: 10), () {
throw TimeoutException('网站配置加载超时(10秒)');
Future.delayed(const Duration(seconds: 25), () {
throw TimeoutException('网站配置加载超时(25秒)');
}),
]);
} on TimeoutException catch (e) {
@@ -178,11 +208,11 @@ class KRSplashController extends GetxController {
print('✅ 设备登录已启用,开始初始化设备信息...');
// 🔧 P2优化:设备登录添加8秒超时保护
// 🔧 Android 15 优化:延长设备登录超时到15秒,匹配网络请求超时
await Future.any([
_executeDeviceLogin(),
Future.delayed(const Duration(seconds: 8), () {
throw TimeoutException('设备登录超时(8秒)');
Future.delayed(const Duration(seconds: 15), () {
throw TimeoutException('设备登录超时(15秒)');
}),
]);
@@ -237,15 +267,19 @@ class KRSplashController extends GetxController {
Future<void> _kr_initialize() async {
try {
_initLog.logPhaseStart('主初始化流程');
_initLog.log('开始执行 _kr_initialize', tag: 'Splash');
KRLogUtil.kr_i('🔧 开始执行 _kr_initialize', tag: 'SplashController');
// 🔧 P0修复:添加总体超时保护(30秒)
// 🔧 Android 15 优化:添加总体超时保护(15秒),更快响应
await Future.any([
_executeInitialization(),
Future.delayed(const Duration(seconds: 30), () {
throw TimeoutException('初始化超时:30秒内未完成');
Future.delayed(const Duration(seconds: 15), () {
throw TimeoutException('初始化超时:15秒内未完成');
}),
]);
_initLog.logPhaseEnd('主初始化流程', success: true);
} on TimeoutException catch (e) {
// 🔧 P2优化:超时错误提供更友好的提示
KRLogUtil.kr_e('⏱️ 初始化超时: $e', tag: 'SplashController');
@@ -311,24 +345,51 @@ class KRSplashController extends GetxController {
// 🔧 P0修复:将原来的初始化逻辑提取到单独方法
Future<void> _executeInitialization() async {
_initLog.log('🔍 开始执行核心初始化流程', tag: 'Init');
// 只在手机端检查网络权限
if (Platform.isIOS || Platform.isAndroid) {
_initLog.log('📱 检测到移动平台,检查网络权限', tag: 'Init');
KRLogUtil.kr_i('📱 移动平台,检查网络权限...', tag: 'SplashController');
final bool hasNetworkPermission = await KRNetworkCheck.kr_initialize(
Get.context!,
onPermissionGranted: () async {
await _kr_continueInitialization();
},
);
if (!hasNetworkPermission) {
kr_hasError.value = true;
kr_errorMessage.value = AppTranslations.kr_splash.kr_networkPermissionFailed;
KRLogUtil.kr_e('❌ 网络权限检查失败', tag: 'SplashController');
try {
_initLog.log('开始网络权限检查(超时8秒)', tag: 'Init');
// 🔧 Android 15 优化:网络权限检查添加 8 秒超时
final bool hasNetworkPermission = await KRNetworkCheck.kr_initialize(
Get.context!,
onPermissionGranted: () async {
_initLog.logSuccess('网络权限已授予', tag: 'Init');
await _kr_continueInitialization();
},
).timeout(
const Duration(seconds: 8),
onTimeout: () {
_initLog.logWarning('网络权限检查超时(8秒)', tag: 'Init');
KRLogUtil.kr_w('⏱️ 网络权限检查超时,执行降级初始化', tag: 'SplashController');
return false;
},
);
if (!hasNetworkPermission) {
// 🔧 Android 15 优化:权限检查失败时执行降级策略而非显示错误
_initLog.logWarning('网络权限检查失败或超时,执行降级初始化', tag: 'Init');
KRLogUtil.kr_w('⚠️ 网络权限检查失败或超时,执行降级初始化', tag: 'SplashController');
await _executeMinimalInitialization();
Get.offAllNamed(Routes.KR_MAIN);
return;
}
_initLog.logSuccess('网络权限检查通过', tag: 'Init');
} catch (e) {
_initLog.logError('网络权限检查异常,执行降级初始化', tag: 'Init', error: e);
KRLogUtil.kr_w('⚠️ 网络权限检查异常: $e,执行降级初始化', tag: 'SplashController');
await _executeMinimalInitialization();
Get.offAllNamed(Routes.KR_MAIN);
return;
}
} else {
// 非手机端直接继续初始化
_initLog.log('💻 检测到桌面平台,直接执行初始化', tag: 'Init');
KRLogUtil.kr_i('💻 桌面平台,直接执行初始化', tag: 'SplashController');
await _kr_continueInitialization();
}
@@ -336,22 +397,44 @@ class KRSplashController extends GetxController {
Future<void> _kr_continueInitialization() async {
try {
_initLog.logSeparator();
_initLog.log('🚀 启动页主流程开始', tag: 'Continue');
_initLog.logSeparator();
KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'SplashController');
KRLogUtil.kr_i('🚀 启动页主流程开始...', tag: 'SplashController');
KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'SplashController');
// 只在手机端检查网络连接
// 🔧 Android 15 优化:网络连接检查改为非阻塞
if (Platform.isIOS || Platform.isAndroid) {
_initLog.log('📱 检查网络连接状态(超时5秒)', tag: 'Continue');
KRLogUtil.kr_i('📱 检查网络连接...', tag: 'SplashController');
final bool isConnected = await KRNetworkCheck.kr_checkNetworkConnection();
if (!isConnected) {
kr_hasError.value = true;
kr_errorMessage.value = AppTranslations.kr_splash.kr_networkConnectionFailed;
KRLogUtil.kr_e('❌ 网络连接失败', tag: 'SplashController');
return;
try {
// 添加5秒超时保护
final bool isConnected = await KRNetworkCheck.kr_checkNetworkConnection().timeout(
const Duration(seconds: 5),
onTimeout: () {
_initLog.logWarning('网络连接检查超时(5秒),继续初始化', tag: 'Continue');
KRLogUtil.kr_w('⏱️ 网络连接检查超时,继续初始化', tag: 'SplashController');
return true; // 超时时允许继续
},
);
if (isConnected) {
_initLog.logSuccess('网络连接正常', tag: 'Continue');
KRLogUtil.kr_i('✅ 网络连接正常', tag: 'SplashController');
} else {
// 🔧 Android 15 优化:网络未连接也允许继续,改为警告而非错误
_initLog.logWarning('网络未连接,应用将以离线模式启动', tag: 'Continue');
KRLogUtil.kr_w('⚠️ 网络未连接,应用将以离线模式启动', tag: 'SplashController');
}
} catch (e) {
// 🔧 Android 15 优化:网络检查异常不阻塞启动
_initLog.logError('网络检查异常,继续初始化', tag: 'Continue', error: e);
KRLogUtil.kr_w('⚠️ 网络检查异常: $e,继续初始化', tag: 'SplashController');
}
KRLogUtil.kr_i('✅ 网络连接正常', tag: 'SplashController');
} else {
_initLog.log('💻 桌面平台,跳过网络连接检查', tag: 'Continue');
KRLogUtil.kr_i('💻 桌面平台,跳过网络连接检查', tag: 'SplashController');
}
@@ -375,19 +458,22 @@ class KRSplashController extends GetxController {
_logStepTiming('设备登录检查完成');
// 初始化配置
_initLog.log('⚙️ 开始初始化应用配置(域名加载等)', tag: 'Continue');
KRLogUtil.kr_i('⚙️ 开始初始化应用配置...', tag: 'SplashController');
await AppConfig().initConfig(
onSuccess: () async {
// 配置初始化成功,继续后续步骤
_initLog.logSuccess('应用配置初始化成功', tag: 'Continue');
KRLogUtil.kr_i('✅ 应用配置初始化成功,继续后续步骤', tag: 'SplashController');
await _kr_continueAfterConfig();
},
);
} catch (e) {
// 配置初始化失败,显示错误信息
KRLogUtil.kr_e('启动页初始化异常: $e', tag: 'SplashController');
kr_hasError.value = true;
kr_errorMessage.value = '${AppTranslations.kr_splash.kr_initializationFailed}$e';
// 🔧 Android 15 优化:配置初始化失败时执行降级策略
_initLog.logError('启动页初始化异常,执行降级策略', tag: 'Continue', error: e);
KRLogUtil.kr_w('⚠️ 启动页初始化异常,执行降级策略: $e', tag: 'SplashController');
await _executeMinimalInitialization();
Get.offAllNamed(Routes.KR_MAIN);
}
}
@@ -424,6 +510,19 @@ class KRSplashController extends GetxController {
KRLogUtil.kr_i('🎫 Token存在: $hasToken', tag: 'SplashController');
KRLogUtil.kr_i('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', tag: 'SplashController');
// 🔧 记录最终状态到日志
_initLog.logSeparator();
_initLog.log('准备进入主页', tag: 'Splash');
_initLog.log('最终登录状态: $loginStatus', tag: 'Splash');
_initLog.log('Token存在: $hasToken', tag: 'Splash');
_initLog.logSuccess('正常初始化流程完成', tag: 'Splash');
// 完成日志收集
await _initLog.finalize();
if (kDebugMode && _initLog.getLogFilePath() != null) {
print('📁 初始化日志文件: ${_initLog.getLogFilePath()}');
}
// 直接导航到主页(无论是否登录,主页会根据登录状态显示不同内容)
_logStepTiming('开始页面导航');
if(loginStatus) {
@@ -444,10 +543,14 @@ class KRSplashController extends GetxController {
print('🕐 启动失败总耗时: ${totalMs}ms (${totalDuration.inSeconds}.${(totalMs % 1000).toString().padLeft(3, '0')}s)');
// 后续步骤失败,显示错误信息
_initLog.logError('启动初始化失败', tag: 'Splash', error: e);
KRLogUtil.kr_e('启动初始化失败: $e', tag: 'SplashController');
KRLogUtil.kr_e('⏰ 启动失败总耗时: ${totalMs}ms', tag: 'SplashController');
kr_hasError.value = true;
kr_errorMessage.value = '${AppTranslations.kr_splash.kr_initializationFailed}$e';
// 完成日志收集
await _initLog.finalize();
}
}