// 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 'pages/playlist_page.dart'; // ✅ 导入 PlaylistPage import 'widgets/global_mini_player.dart'; final GlobalKey navigatorKey = GlobalKey(); void main() { WidgetsFlutterBinding.ensureInitialized(); bool initSuccess = false; String? initError; try { MediaKit.ensureInitialized(); PlaybackService().init(); initSuccess = true; } catch (e, stack) { initError = '初始化失败: $e'; print('❌ $initError'); print(stack); } runApp( ChangeNotifierProvider( create: (_) => AudioService(), child: QTPlayerApp( initSuccess: initSuccess, initError: initError, ), ), ); } class QTPlayerApp extends StatefulWidget { final bool initSuccess; final String? initError; const QTPlayerApp({ super.key, required this.initSuccess, required this.initError, }); @override State createState() => _QTPlayerAppState(); } class _QTPlayerAppState extends State with SingleTickerProviderStateMixin { bool _showPlayerPage = false; bool _showPlaylist = false; // ✅ 新增:播放列表显示状态 late final AnimationController _animationController; late final Animation _slideAnimation; @override void initState() { super.initState(); GlobalMiniPlayer.onOpenPlayerPage = _openPlayerPage; GlobalMiniPlayer.onOpenPlaylistPage = _openPlaylist; _animationController = AnimationController( vsync: this, duration: const Duration(milliseconds: 300), ); _slideAnimation = Tween(begin: 1.0, end: 0.0).animate( CurvedAnimation( parent: _animationController, curve: Curves.easeOutCubic, ), ); } @override void dispose() { _animationController.dispose(); super.dispose(); } void _openPlayerPage() { setState(() { _showPlayerPage = true; _showPlaylist = false; // 打开播放页时关闭播放列表 }); _animationController.forward(from: 0.0); } void _closePlayerPage() { _animationController.reverse().then((_) { setState(() { _showPlayerPage = false; }); }); } // ✅ 打开播放列表 void _openPlaylist() { setState(() { _showPlaylist = true; }); } // ✅ 关闭播放列表 void _closePlaylist() { setState(() { _showPlaylist = false; }); } @override Widget build(BuildContext context) { if (!widget.initSuccess) { return 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), const Text( '应用初始化失败', style: TextStyle(color: Colors.white, fontSize: 20), ), const SizedBox(height: 8), Text( widget.initError ?? '未知错误', style: TextStyle(color: Colors.grey[400], fontSize: 14), textAlign: TextAlign.center, ), const SizedBox(height: 24), ElevatedButton( onPressed: () { runApp( ChangeNotifierProvider( create: (_) => AudioService(), child: QTPlayerApp( initSuccess: true, initError: null, ), ), ); }, style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFFB8D4D0), foregroundColor: Colors.black87, ), child: const Text('重试'), ), ], ), ), ), ); } 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: AnimatedBuilder( animation: _animationController, builder: (context, child) { final progress = _slideAnimation.value; final offsetY = MediaQuery.of(context).size.height * progress; return Transform.translate( offset: Offset(0, offsetY), child: Opacity( opacity: 1.0 - progress * 0.3, child: child, ), ); }, child: PlayerPage( onClose: _closePlayerPage, onOpenPlaylist: _openPlaylist, // ✅ 传入回调 ), ), ), // ④ ✅ 播放列表(最高层级,在播放页之上) if (_showPlaylist) Positioned.fill( child: PlaylistPage( onClose: _closePlaylist, ), ), ], ), ), ], ); }, ); } }