新增编译模式下对日志进行输出,并且更新了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
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:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user