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); + } +}