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'; 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'; debugPrint('❌ $initError'); debugPrint(stack.toString()); } runApp( MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => AudioService()), ], child: QTPlayerApp( initSuccess: initSuccess, initError: initError, ), ), ); } // ═══════════════════════════════════════════════════ // RouteManager - 路由状态管理 // ═══════════════════════════════════════════════════ class RouteManager extends ChangeNotifier { static final RouteManager _instance = RouteManager._internal(); factory RouteManager() => _instance; RouteManager._internal(); String _currentRoute = '/'; String get currentRoute => _currentRoute; bool get showMiniPlayer => _currentRoute != '/player' && _currentRoute != '/playlist'; void updateRoute(String route) { if (_currentRoute != route) { _currentRoute = route; debugPrint('📌 路由更新: $route'); notifyListeners(); } } } // ═══════════════════════════════════════════════════ // 导航观察者 - 监听路由变化 // ═══════════════════════════════════════════════════ class MiniPlayerNavigatorObserver extends NavigatorObserver { void _updateRoute(Route? route) { final name = route?.settings.name ?? '/'; RouteManager().updateRoute(name); } @override void didPush(Route route, Route? previousRoute) { _updateRoute(route); } @override void didPop(Route route, Route? previousRoute) { // ⭐ 关键:用 previousRoute 而不是 navigatorKey.currentContext _updateRoute(previousRoute); } @override void didReplace({Route? newRoute, Route? oldRoute}) { _updateRoute(newRoute); } } // ═══════════════════════════════════════════════════ // 主应用 // ═══════════════════════════════════════════════════ class QTPlayerApp extends StatelessWidget { final bool initSuccess; final String? initError; const QTPlayerApp({ super.key, required this.initSuccess, required this.initError, }); @override Widget build(BuildContext context) { if (!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( initError ?? '未知错误', style: TextStyle(color: Colors.grey[400], fontSize: 14), textAlign: TextAlign.center, ), ], ), ), ), ); } return MaterialApp( title: '清听', 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, ), navigatorKey: navigatorKey, navigatorObservers: [MiniPlayerNavigatorObserver()], routes: { '/': (context) => const HomePage(), '/player': (context) => const PlayerPage(), '/playlist': (context) => const PlaylistPage(), }, // ⭐ 核心改动:删除手写 Overlay,直接用 Stack builder: (context, child) { return Stack( fit: StackFit.expand, children: [ // 1. Navigator(所有路由页面) if (child != null) child, // 2. MiniPlayer(由路由状态控制显隐) AnimatedBuilder( animation: RouteManager(), builder: (context, _) { if (!RouteManager().showMiniPlayer) { return const SizedBox.shrink(); } return const Align( alignment: Alignment.bottomCenter, child: GlobalMiniPlayer(), ); }, ), ], ); }, ); } }