界面优先级存在部分问题,先锁定到这个版本,进行后续优化

This commit is contained in:
2026-08-19 21:32:54 +08:00
parent 85463c3716
commit d116814bb6
3 changed files with 206 additions and 81 deletions
+114
View File
@@ -0,0 +1,114 @@
// lib/pages/shell_page.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../services/audio_service.dart';
import '../widgets/global_mini_player.dart';
import 'home_page.dart';
import 'player_page.dart';
import 'playlist_page.dart';
class ShellPage extends StatefulWidget {
const ShellPage({super.key});
@override
State<ShellPage> createState() => _ShellPageState();
}
class _ShellPageState extends State<ShellPage> {
// ✅ 从 PlayerPage 打开 PlaylistPage
void _openPlaylistFromPlayer() {
Navigator.pushNamed(context, '/playlist');
}
// ✅ 关闭 PlayerPage
void _closePlayer() {
Navigator.pop(context);
}
// ✅ 关闭 PlaylistPage
void _closePlaylist() {
Navigator.pop(context);
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: const Color(0xFF0E1211),
body: Stack(
children: [
// ---- 页面内容(Navigator ----
Navigator(
initialRoute: '/',
onGenerateRoute: (settings) {
switch (settings.name) {
case '/':
return _buildPageRoute(
const HomePage(),
settings: settings,
);
case '/player':
return _buildPageRoute(
PlayerPage(
onClose: _closePlayer,
onOpenPlaylist: _openPlaylistFromPlayer,
),
settings: settings,
fromBottom: true,
);
case '/playlist':
return _buildPageRoute(
PlaylistPage(
onClose: _closePlaylist,
),
settings: settings,
);
default:
return null;
}
},
),
// ---- MiniPlayer(覆盖在最上层) ----
const Positioned(
left: 0,
right: 0,
bottom: 0,
child: GlobalMiniPlayer(),
),
],
),
);
}
PageRouteBuilder _buildPageRoute(
Widget page, {
required RouteSettings settings,
bool fromBottom = false,
}) {
return PageRouteBuilder(
settings: settings,
pageBuilder: (context, animation, secondaryAnimation) => page,
transitionsBuilder: (context, animation, secondaryAnimation, child) {
if (fromBottom) {
// 播放页:从底部滑入
final offset = Tween<Offset>(
begin: const Offset(0, 1),
end: Offset.zero,
).animate(CurvedAnimation(
parent: animation,
curve: Curves.easeOutCubic,
));
return SlideTransition(position: offset, child: child);
} else {
// 其他页面:淡入
return FadeTransition(
opacity: animation,
child: child,
);
}
},
transitionDuration: const Duration(milliseconds: 300),
reverseTransitionDuration: const Duration(milliseconds: 300),
);
}
}