From 01de10062ebd230fad7c51de78d28b2f1f537e57 Mon Sep 17 00:00:00 2001 From: lxh2875931338 Date: Thu, 20 Aug 2026 00:05:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=87=86=E5=A4=87=E8=BF=9B=E8=A1=8C=E9=A6=96?= =?UTF-8?q?=E5=B8=A7=E9=98=BB=E5=A1=9E=E5=88=86=E6=9E=90=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=EF=BC=8C=E9=9C=80=E8=A6=81=E5=85=88=E6=89=93=E4=B8=80=E4=B8=AA?= =?UTF-8?q?commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main.dart | 96 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 56 insertions(+), 40 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index be86c4c..931aa2e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -12,6 +12,9 @@ import 'widgets/global_mini_player.dart'; final GlobalKey navigatorKey = GlobalKey(); +// ═══════════════════════════════════════════════════ +// main: 只做 runApp,不做任何初始化 +// ═══════════════════════════════════════════════════ void main() { WidgetsFlutterBinding.ensureInitialized(); @@ -24,45 +27,10 @@ void main() { child: const QTPlayerApp(), ), ); - - // ⭐ 首帧渲染完成后才执行初始化 - WidgetsBinding.instance.addPostFrameCallback((_) { - _initializeServices(); - }); -} - -void _initializeServices() async { - final lifecycle = AppLifecycleService(); - - try { - // 1. MediaKit - lifecycle.updateStatus(AppStatus.mediaKitInitializing); - MediaKit.ensureInitialized(); - lifecycle.updateStatus(AppStatus.mediaKitReady); - - // 2. PlaybackService - lifecycle.updateStatus(AppStatus.playerInitializing); - PlaybackService().init(); - lifecycle.updateStatus(AppStatus.playerReady); - - // 3. WebDAV - lifecycle.updateStatus(AppStatus.webdavChecking); - final hasCred = await WebDAVService.instance.loadCredentials(); - if (hasCred) { - lifecycle.updateStatus(AppStatus.webdavReady); - } else { - lifecycle.updateStatus(AppStatus.webdavMissing); - } - - lifecycle.updateStatus(AppStatus.fullReady); - } catch (e) { - debugPrint('❌ 初始化错误: $e'); - lifecycle.updateStatus(AppStatus.error); - } } // ═══════════════════════════════════════════════════ -// RouteManager +// RouteManager - 路由状态 // ═══════════════════════════════════════════════════ class RouteManager extends ChangeNotifier { static final RouteManager _instance = RouteManager._internal(); @@ -86,7 +54,7 @@ class RouteManager extends ChangeNotifier { } // ═══════════════════════════════════════════════════ -// 导航观察者 +// MiniPlayerNavigatorObserver - 路由监听 // ═══════════════════════════════════════════════════ class MiniPlayerNavigatorObserver extends NavigatorObserver { void _updateRoute(Route? route) { @@ -111,14 +79,31 @@ class MiniPlayerNavigatorObserver extends NavigatorObserver { } // ═══════════════════════════════════════════════════ -// QTPlayerApp - 无状态,只负责组装 +// QTPlayerApp - 主应用 // ═══════════════════════════════════════════════════ -class QTPlayerApp extends StatelessWidget { +class QTPlayerApp extends StatefulWidget { const QTPlayerApp({super.key}); + @override + State createState() => _QTPlayerAppState(); +} + +class _QTPlayerAppState extends State { + @override + void initState() { + super.initState(); + + // 首帧完成后才开始初始化 + WidgetsBinding.instance.addPostFrameCallback((_) { + debugPrint('🖼️ Flutter 首帧已完成'); + _initializeServices(); + }); + } + @override Widget build(BuildContext context) { - debugPrint('🔥 QTPlayerApp.build() 执行,首帧即将渲染'); + debugPrint('🎨 QTPlayerApp.build()'); + return MaterialApp( title: '清听', theme: ThemeData( @@ -162,3 +147,34 @@ class QTPlayerApp extends StatelessWidget { ); } } + +// ═══════════════════════════════════════════════════ +// 后台初始化 - 在首帧完成后执行 +// ═══════════════════════════════════════════════════ +void _initializeServices() async { + final lifecycle = AppLifecycleService(); + + try { + lifecycle.updateStatus(AppStatus.mediaKitInitializing); + MediaKit.ensureInitialized(); + lifecycle.updateStatus(AppStatus.mediaKitReady); + + lifecycle.updateStatus(AppStatus.playerInitializing); + PlaybackService().init(); + lifecycle.updateStatus(AppStatus.playerReady); + + lifecycle.updateStatus(AppStatus.webdavChecking); + final hasCred = await WebDAVService.instance.loadCredentials(); + if (hasCred) { + lifecycle.updateStatus(AppStatus.webdavReady); + } else { + lifecycle.updateStatus(AppStatus.webdavMissing); + } + + lifecycle.updateStatus(AppStatus.fullReady); + debugPrint('✅ 应用完全就绪'); + } catch (e) { + debugPrint('❌ 初始化错误: $e'); + lifecycle.updateStatus(AppStatus.error); + } +}