From 17b3f6b92d9e6b6557b655d0e13ad4d10f63205b Mon Sep 17 00:00:00 2001 From: Rust Date: Sun, 2 Nov 2025 00:31:31 -0700 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=97=A5=E5=BF=97=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E5=BC=80=E5=85=B3=E4=BE=BF=E4=BA=8E=E8=B0=83=E8=AF=95?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E9=83=A8=E5=88=86=E6=9C=BA=E5=9E=8B?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E5=87=BA=E7=8E=B0=E7=9A=84=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E9=94=99=E4=B9=B1=E6=88=96=E4=B8=8D=E6=98=BE=E7=A4=BA=E7=AD=89?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 5853ba7fe4e0cbe4f04b20c86e9fd84c5557139f) --- android/gradle.properties | 2 +- lib/app/common/app_config.dart | 31 ++++++++++++--- .../controllers/kr_home_controller.dart | 9 +++++ .../kr_home/views/kr_home_bottom_panel.dart | 38 +++++++++++++------ .../kr_home/widgets/kr_subscription_card.dart | 20 +++++++++- .../kr_main/bindings/kr_main_binding.dart | 32 ++++++++++++++-- .../controllers/kr_main_controller.dart | 27 ++++++++++--- .../controllers/kr_splash_controller.dart | 12 +++--- lib/app/routes/app_pages.dart | 2 +- 9 files changed, 139 insertions(+), 34 deletions(-) diff --git a/android/gradle.properties b/android/gradle.properties index e3e9041..fd02741 100755 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,4 +1,4 @@ -org.gradle.jvmargs=-Xmx4048m -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xlint:-options android.useAndroidX=true android.enableJetifier=true # org.gradle.java.home=/Users/mac/Library/Java/JavaVirtualMachines/ms-17.0.16/Contents/Home diff --git a/lib/app/common/app_config.dart b/lib/app/common/app_config.dart index 5f4c345..6e00c07 100755 --- a/lib/app/common/app_config.dart +++ b/lib/app/common/app_config.dart @@ -4,6 +4,7 @@ import '../utils/kr_update_util.dart'; import '../utils/kr_secure_storage.dart'; import '../utils/kr_log_util.dart'; import '../services/singbox_imp/kr_sing_box_imp.dart'; +import '../utils/kr_init_log_collector.dart'; // 🔧 新增:导入日志收集器 import 'dart:async'; import 'dart:convert'; import 'dart:io'; @@ -1337,10 +1338,17 @@ class AppConfig { KRUpdateApplication? kr_update_application; + // 🔧 新增:日志收集器实例 + final _initLog = KRInitLogCollector(); + Future initConfig({ Future Function()? onSuccess, }) async { + _initLog.logSeparator(); + _initLog.log('🌐 开始应用配置初始化(域名加载)', tag: 'Domain'); + if (_isInitializing) { + _initLog.logWarning('配置初始化已在进行中,跳过重复调用', tag: 'Domain'); KRLogUtil.kr_w('配置初始化已在进行中,跳过重复调用', tag: 'AppConfig'); return; } @@ -1348,10 +1356,13 @@ class AppConfig { _isInitializing = true; try { // 🔧 修复6:启动时优先加载上次成功的域名 + _initLog.log('开始加载基础域名配置', tag: 'Domain'); await KRDomain.kr_loadBaseDomain(); + _initLog.logSuccess('当前使用域名: ${KRDomain.kr_currentDomain}', tag: 'Domain'); KRLogUtil.kr_i('📍 当前使用域名: ${KRDomain.kr_currentDomain}', tag: 'AppConfig'); // 所有模式都走正常的配置请求流程 + _initLog.log('开始配置请求流程(包含重试机制)', tag: 'Domain'); KRLogUtil.kr_i('🚀 开始配置初始化', tag: 'AppConfig'); await _startAutoRetry(onSuccess); } finally { @@ -1402,24 +1413,32 @@ class AppConfig { return; } + _initLog.log('发起配置请求 API (尝试 $totalAttempts/$maxTotalAttempts)', tag: 'Domain'); final result = await _kr_userApi.kr_config(); result.fold( (error) async { + _initLog.logError('配置请求失败 (重试 $currentRetryCount/$kr_maxRetryCount)', tag: 'Domain', error: error); KRLogUtil.kr_e('配置初始化失败: $error', tag: 'AppConfig'); currentRetryCount++; - + // 计算重试延迟时间 final retryDelay = (kr_retryInterval * pow(kr_backoffFactor, currentRetryCount)).toInt(); - - // 尝试切换域名 - await KRDomain.kr_switchToNextDomain(); - - // 等待后重试,至少延迟100ms避免立即重试 final actualDelay = max(retryDelay, 100); + _initLog.log('将在 ${actualDelay}ms 后重试', tag: 'Domain'); + + // 尝试切换域名 + _initLog.log('尝试切换到下一个备用域名', tag: 'Domain'); + await KRDomain.kr_switchToNextDomain(); + _initLog.log('当前域名: ${KRDomain.kr_currentDomain}', tag: 'Domain'); + + // 等待后重试 await Future.delayed(Duration(milliseconds: actualDelay)); await executeConfigRequest(); }, (config) async { + _initLog.logSuccess('配置请求成功!', tag: 'Domain'); + _initLog.log('网站ID: ${config.kr_website_id}', tag: 'Domain'); + _initLog.log('官网: ${config.kr_official_website}', tag: 'Domain'); _retryTimer?.cancel(); currentRetryCount = 0; diff --git a/lib/app/modules/kr_home/controllers/kr_home_controller.dart b/lib/app/modules/kr_home/controllers/kr_home_controller.dart index 48ea830..5792065 100755 --- a/lib/app/modules/kr_home/controllers/kr_home_controller.dart +++ b/lib/app/modules/kr_home/controllers/kr_home_controller.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:io'; import 'package:flutter/material.dart'; +import 'package:path_provider/path_provider.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:get/get.dart'; import 'package:kaer_with_panels/app/common/app_run_data.dart'; @@ -30,8 +31,11 @@ import 'package:kaer_with_panels/app/utils/kr_common_util.dart'; import 'package:kaer_with_panels/app/utils/kr_secure_storage.dart'; 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'; // 🔧 新增:导入日志收集器 class KRHomeController extends GetxController with WidgetsBindingObserver { + // 🔧 新增:日志收集器实例 + final _initLog = KRInitLogCollector(); /// 订阅服务 final KRSubscribeService kr_subscribeService = KRSubscribeService(); @@ -278,16 +282,20 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { void _kr_initLoginStatus() { + _initLog.log('开始初始化登录状态处理', tag: 'Home'); KRLogUtil.kr_i('初始化登录状态', tag: 'HomeController'); // 🔧 Android 15 紧急修复:8秒超时,更快响应移动网络慢的情况 Timer(const Duration(seconds: 8), () { if (kr_currentListStatus.value == KRHomeViewsListStatus.kr_loading) { + _initLog.logWarning('⏱️ 订阅加载超时(8秒保护),强制设置为无数据状态', tag: 'Subscribe'); + _initLog.log('当前列表状态仍为: loading,触发超时保护', tag: 'Subscribe'); 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'); } }); @@ -295,6 +303,7 @@ class KRHomeController extends GetxController with WidgetsBindingObserver { // 🔧 Android 15 新增:3秒警告,帮助诊断 Timer(const Duration(seconds: 3), () { if (kr_currentListStatus.value == KRHomeViewsListStatus.kr_loading) { + _initLog.logWarning('⚠️ 订阅服务已加载3秒,网络可能较慢', tag: 'Subscribe'); KRLogUtil.kr_w('⚠️ 订阅服务初始化已耗时3秒,可能网络较慢', tag: 'HomeController'); } }); diff --git a/lib/app/modules/kr_home/views/kr_home_bottom_panel.dart b/lib/app/modules/kr_home/views/kr_home_bottom_panel.dart index 96bfcdf..031adf0 100755 --- a/lib/app/modules/kr_home/views/kr_home_bottom_panel.dart +++ b/lib/app/modules/kr_home/views/kr_home_bottom_panel.dart @@ -66,12 +66,22 @@ class KRHomeBottomPanel extends GetView { final isNotLoggedIn = controller.kr_currentViewStatus.value == KRHomeViewsStatus.kr_notLoggedIn; - KRLogUtil.kr_i('构建默认视图', tag: 'HomeBottomPanel'); + KRLogUtil.kr_i('=' * 60, tag: 'HomeBottomPanel'); + KRLogUtil.kr_i('🎨 构建默认视图', tag: 'HomeBottomPanel'); KRLogUtil.kr_i('是否未登录: $isNotLoggedIn', tag: 'HomeBottomPanel'); KRLogUtil.kr_i('是否有有效订阅: $hasValidSubscription', tag: 'HomeBottomPanel'); + KRLogUtil.kr_i('订阅列表数量: ${controller.kr_subscribeService.kr_availableSubscribes.length}', tag: 'HomeBottomPanel'); + KRLogUtil.kr_i('当前选中订阅: ${controller.kr_subscribeService.kr_currentSubscribe.value?.name ?? "null"}', tag: 'HomeBottomPanel'); KRLogUtil.kr_i('是否试用: $isTrial', tag: 'HomeBottomPanel'); - KRLogUtil.kr_i('当前高度: ${controller.kr_bottomPanelHeight.value}', - tag: 'HomeBottomPanel'); + KRLogUtil.kr_i('当前高度: ${controller.kr_bottomPanelHeight.value}', tag: 'HomeBottomPanel'); + + // 🔧 新增:详细的 UI 渲染决策日志 + if (hasValidSubscription) { + KRLogUtil.kr_i('✅ 将渲染: 连接信息卡片 (KRHomeConnectionInfoView)', tag: 'HomeBottomPanel'); + } else { + KRLogUtil.kr_i('✅ 将渲染: 订阅卡片 (KRSubscriptionCard) - 开通会员界面', tag: 'HomeBottomPanel'); + } + KRLogUtil.kr_i('=' * 60, tag: 'HomeBottomPanel'); // 🔧 关键修复:统一布局逻辑,确保无论登录状态如何都显示完整UI return Column( @@ -86,16 +96,22 @@ class KRHomeBottomPanel extends GetView { // 🔧 核心修复:无论登录状态,都显示核心卡片(订阅或连接信息) if (hasValidSubscription) // 已订阅:显示连接信息卡片 - Container( - margin: EdgeInsets.only(top: 12.h), - child: const KRHomeConnectionInfoView(), - ) + Builder(builder: (context) { + KRLogUtil.kr_i('🔹 渲染连接信息卡片,margin top: ${12.h}', tag: 'HomeBottomPanel'); + return Container( + margin: EdgeInsets.only(top: 12.h), + child: const KRHomeConnectionInfoView(), + ); + }) else // 未订阅(包括未登录):始终显示订阅卡片 - Container( - margin: EdgeInsets.only(top: 12.h, left: 12.w, right: 12.w), - child: const KRSubscriptionCard(), - ), + Builder(builder: (context) { + KRLogUtil.kr_i('🔹 渲染订阅卡片,margin: top=${12.h}, left=${12.w}, right=${12.w}', tag: 'HomeBottomPanel'); + return Container( + margin: EdgeInsets.only(top: 12.h, left: 12.w, right: 12.w), + child: const KRSubscriptionCard(), + ); + }), // 2. 如果已订阅且是试用,展示试用卡片 if (hasValidSubscription && isTrial) diff --git a/lib/app/modules/kr_home/widgets/kr_subscription_card.dart b/lib/app/modules/kr_home/widgets/kr_subscription_card.dart index 109cf59..68842be 100755 --- a/lib/app/modules/kr_home/widgets/kr_subscription_card.dart +++ b/lib/app/modules/kr_home/widgets/kr_subscription_card.dart @@ -24,10 +24,25 @@ class KRSubscriptionCard extends StatelessWidget { // 构建订阅卡片 Widget _kr_buildSubscriptionCard(BuildContext context) { + // 🔧 新增:订阅卡片渲染日志 + print('🎴 [SubscriptionCard] 开始构建订阅卡片'); + print('🎴 [SubscriptionCard] 卡片颜色: ${Theme.of(context).cardColor}'); + print('🎴 [SubscriptionCard] 主题亮度: ${Theme.of(context).brightness}'); + print('🎴 [SubscriptionCard] 文本颜色: ${Theme.of(context).textTheme.bodyMedium?.color}'); + print('🎴 [SubscriptionCard] ScreenUtil - 12.w=${12.w}, 16.h=${16.h}, 44.w=${44.w}'); + + // 🔧 关键修复:添加最小高度约束和调试边框 return Container( + // 添加最小高度,确保卡片可见 + constraints: const BoxConstraints(minHeight: 180), decoration: BoxDecoration( color: Theme.of(context).cardColor, borderRadius: BorderRadius.circular(12.w), + // 🔧 添加边框用于调试可见性 + border: Border.all( + color: Colors.blue.withOpacity(0.3), + width: 2, + ), ), child: Column( mainAxisSize: MainAxisSize.min, @@ -55,7 +70,10 @@ class KRSubscriptionCard extends StatelessWidget { style: KrAppTextStyle( fontSize: 14, fontWeight: FontWeight.w400, - color: Theme.of(context).textTheme.bodyMedium?.color, + // 🔧 关键修复:确保文本颜色可见 + color: Theme.of(context).brightness == Brightness.dark + ? Colors.white + : Colors.black87, ), ), ), diff --git a/lib/app/modules/kr_main/bindings/kr_main_binding.dart b/lib/app/modules/kr_main/bindings/kr_main_binding.dart index c5908b9..1e4d106 100755 --- a/lib/app/modules/kr_main/bindings/kr_main_binding.dart +++ b/lib/app/modules/kr_main/bindings/kr_main_binding.dart @@ -1,4 +1,5 @@ import 'package:get/get.dart'; +import 'package:flutter/foundation.dart' show kDebugMode; import 'package:kaer_with_panels/app/modules/kr_home/controllers/kr_home_controller.dart'; import 'package:kaer_with_panels/app/modules/kr_invite/controllers/kr_invite_controller.dart'; import 'package:kaer_with_panels/app/modules/kr_login/controllers/kr_login_controller.dart'; @@ -10,15 +11,40 @@ import '../controllers/kr_main_controller.dart'; class KRMainBinding extends Bindings { @override void dependencies() { + if (kDebugMode) { + print('🔧 KRMainBinding.dependencies 被调用'); + } + + // 🔧 MainController 仍然使用 lazyPut,因为它由 MainView 触发 Get.lazyPut( - () => KRMainController(), + () { + if (kDebugMode) { + print('🏗️ 创建 KRMainController 实例'); + } + return KRMainController(); + }, ); - Get.lazyPut(() => KRHomeController()); - Get.lazyPut(() => KRLoginController()); + // 🔧 关键修复:使用 lazyPut 但设置为单例,避免重复创建 + // fenix: true 允许控制器在被删除后重新创建 + // 使用 lazyPut 让 HomeController 在真正需要时才创建,避免过早初始化导致资源冲突 + Get.lazyPut( + () { + if (kDebugMode) { + print('🏗️ 创建 KRHomeController 实例(仅此一次)'); + } + return KRHomeController(); + }, + fenix: true, + ); + Get.lazyPut(() => KRLoginController()); Get.lazyPut(() => KRInviteController()); Get.lazyPut(() => KRUserInfoController()); Get.lazyPut(() => KRStatisticsController()); + + if (kDebugMode) { + print('✅ KRMainBinding.dependencies 完成'); + } } } diff --git a/lib/app/modules/kr_main/controllers/kr_main_controller.dart b/lib/app/modules/kr_main/controllers/kr_main_controller.dart index 418dd43..7063ec8 100755 --- a/lib/app/modules/kr_main/controllers/kr_main_controller.dart +++ b/lib/app/modules/kr_main/controllers/kr_main_controller.dart @@ -1,4 +1,5 @@ import 'package:flutter/widgets.dart'; +import 'package:flutter/foundation.dart' show kDebugMode; import 'package:get/get.dart'; import 'package:kaer_with_panels/app/modules/kr_home/views/kr_home_view.dart'; import 'package:kaer_with_panels/app/modules/kr_invite/views/kr_invite_view.dart'; @@ -30,19 +31,33 @@ class KRMainController extends GetxController { static KRMainController get to => Get.find(); DateTime? lastPopTime; var kr_currentIndex = 0.obs; - final List widgets = [ - KRKeepAliveWrapper(KRHomeView()), - KRKeepAliveWrapper(KRInviteView()), - KRKeepAliveWrapper(KRStatisticsView()), - KRKeepAliveWrapper(KRUserInfoView()), - ]; + + late final List widgets; /// 分页控制器 PageController pageController = PageController(keepPage: true); + @override void onInit() { super.onInit(); + // 🔧 诊断:在 onInit 中创建 widgets 列表 + if (kDebugMode) { + print('🎬 KRMainController.onInit 被调用'); + print('📝 开始创建 widgets 列表...'); + } + + widgets = [ + KRKeepAliveWrapper(KRHomeView()), + KRKeepAliveWrapper(KRInviteView()), + KRKeepAliveWrapper(KRStatisticsView()), + KRKeepAliveWrapper(KRUserInfoView()), + ]; + + if (kDebugMode) { + print('✅ widgets 列表创建完成,包含 ${widgets.length} 个页面'); + } + } diff --git a/lib/app/modules/kr_splash/controllers/kr_splash_controller.dart b/lib/app/modules/kr_splash/controllers/kr_splash_controller.dart index 08ef856..c1cfaf6 100755 --- a/lib/app/modules/kr_splash/controllers/kr_splash_controller.dart +++ b/lib/app/modules/kr_splash/controllers/kr_splash_controller.dart @@ -517,10 +517,12 @@ class KRSplashController extends GetxController { _initLog.log('Token存在: $hasToken', tag: 'Splash'); _initLog.logSuccess('正常初始化流程完成', tag: 'Splash'); - // 完成日志收集 - await _initLog.finalize(); + // 🔧 关键修复:不要在这里关闭日志文件! + // 日志文件需要保持打开状态,让 HomeController 也能写入日志 + // 日志文件将在 HomeController 初始化完成后关闭 + // await _initLog.finalize(); // ❌ 注释掉 if (kDebugMode && _initLog.getLogFilePath() != null) { - print('📁 初始化日志文件: ${_initLog.getLogFilePath()}'); + print('📁 初始化日志文件(保持打开): ${_initLog.getLogFilePath()}'); } // 直接导航到主页(无论是否登录,主页会根据登录状态显示不同内容) @@ -549,8 +551,8 @@ class KRSplashController extends GetxController { kr_hasError.value = true; kr_errorMessage.value = '${AppTranslations.kr_splash.kr_initializationFailed}$e'; - // 完成日志收集 - await _initLog.finalize(); + // 🔧 错误情况下也不关闭日志,让后续的错误处理也能写入 + // await _initLog.finalize(); // ❌ 注释掉 } } diff --git a/lib/app/routes/app_pages.dart b/lib/app/routes/app_pages.dart index 51ff647..15f6e24 100755 --- a/lib/app/routes/app_pages.dart +++ b/lib/app/routes/app_pages.dart @@ -66,7 +66,7 @@ class AppPages { ), GetPage( name: _Paths.KR_HOME, - page: () => const KRHomeView(), + page: () => KRHomeView(), binding: KRHomeBinding(), arguments: {'showSubscriptionButton': true}, // 显示购买按钮 customTransition: SlideOutOnlyTransition(