准备进行首帧阻塞分析测试,需要先打一个commit
This commit is contained in:
+56
-40
@@ -12,6 +12,9 @@ import 'widgets/global_mini_player.dart';
|
||||
|
||||
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
|
||||
|
||||
// ═══════════════════════════════════════════════════
|
||||
// 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<QTPlayerApp> createState() => _QTPlayerAppState();
|
||||
}
|
||||
|
||||
class _QTPlayerAppState extends State<QTPlayerApp> {
|
||||
@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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user