// lib/main.dart import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:media_kit/media_kit.dart'; import 'services/audio_service.dart'; import 'services/playback_service.dart'; import 'pages/home_page.dart'; import 'pages/player_page.dart'; import 'widgets/global_mini_player.dart'; // ✅ 全局导航键 final GlobalKey navigatorKey = GlobalKey(); void main() { WidgetsFlutterBinding.ensureInitialized(); try { MediaKit.ensureInitialized(); PlaybackService().init(); } catch (e, stack) { print('❌ 初始化失败: $e'); print(stack); runApp( MaterialApp( home: Scaffold( backgroundColor: const Color(0xFF0E1211), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon(Icons.error_outline, size: 64, color: Colors.red[300]), const SizedBox(height: 16), Text( '应用初始化失败', style: TextStyle(color: Colors.white, fontSize: 20), ), const SizedBox(height: 8), Text( '$e', style: TextStyle(color: Colors.grey[400], fontSize: 14), textAlign: TextAlign.center, ), ], ), ), ), ), ); return; } FlutterError.onError = (details) { print('❌ Flutter Error: ${details.exception}'); print('Stack: ${details.stack}'); }; runApp( ChangeNotifierProvider( create: (_) => AudioService(), child: const QTPlayerApp(), ), ); } class QTPlayerApp extends StatefulWidget { const QTPlayerApp({super.key}); @override State createState() => _QTPlayerAppState(); } class _QTPlayerAppState extends State { bool _showPlayerPage = false; // ✅ 播放页回调,暴露给 GlobalMiniPlayer void _openPlayerPage() { setState(() { _showPlayerPage = true; }); } void _closePlayerPage() { setState(() { _showPlayerPage = false; }); } @override void initState() { super.initState(); // ✅ 注入回调(GlobalMiniPlayer 是 static 成员) GlobalMiniPlayer.onOpenPlayerPage = _openPlayerPage; } @override Widget build(BuildContext context) { return MaterialApp( title: '清听', navigatorKey: navigatorKey, theme: ThemeData( brightness: Brightness.dark, primaryColor: const Color(0xFF7C9A9E), colorScheme: const ColorScheme.dark( primary: Color(0xFF7C9A9E), secondary: Color(0xFFB8D4D0), surface: Color(0xFF1A1F1E), onSurface: Colors.white, ), useMaterial3: true, ), home: const HomePage(), builder: (context, child) { return Overlay( initialEntries: [ OverlayEntry( builder: (context) => Stack( children: [ // ① 主页面 Positioned.fill(child: child!), // ② MiniPlayer const Positioned( left: 0, right: 0, bottom: 0, child: GlobalMiniPlayer(), ), // ③ 播放页(全屏覆盖) if (_showPlayerPage) Positioned.fill( child: PlayerPage( onClose: _closePlayerPage, ), ), ], ), ), ], ); }, ); } }