准备进行首帧阻塞分析测试,需要先打一个commit

This commit is contained in:
2026-08-20 00:05:30 +08:00
parent 90f4b4e7ae
commit 01de10062e
+56 -40
View File
@@ -12,6 +12,9 @@ import 'widgets/global_mini_player.dart';
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>(); final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
// ═══════════════════════════════════════════════════
// main: 只做 runApp,不做任何初始化
// ═══════════════════════════════════════════════════
void main() { void main() {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
@@ -24,45 +27,10 @@ void main() {
child: const QTPlayerApp(), 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 { class RouteManager extends ChangeNotifier {
static final RouteManager _instance = RouteManager._internal(); static final RouteManager _instance = RouteManager._internal();
@@ -86,7 +54,7 @@ class RouteManager extends ChangeNotifier {
} }
// ═══════════════════════════════════════════════════ // ═══════════════════════════════════════════════════
// 导航观察者 // MiniPlayerNavigatorObserver - 路由监听
// ═══════════════════════════════════════════════════ // ═══════════════════════════════════════════════════
class MiniPlayerNavigatorObserver extends NavigatorObserver { class MiniPlayerNavigatorObserver extends NavigatorObserver {
void _updateRoute(Route? route) { 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}); const QTPlayerApp({super.key});
@override
State<QTPlayerApp> createState() => _QTPlayerAppState();
}
class _QTPlayerAppState extends State<QTPlayerApp> {
@override
void initState() {
super.initState();
// 首帧完成后才开始初始化
WidgetsBinding.instance.addPostFrameCallback((_) {
debugPrint('🖼️ Flutter 首帧已完成');
_initializeServices();
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
debugPrint('🔥 QTPlayerApp.build() 执行,首帧即将渲染'); debugPrint('🎨 QTPlayerApp.build()');
return MaterialApp( return MaterialApp(
title: '清听', title: '清听',
theme: ThemeData( 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);
}
}