页面层级与返回逻辑实现完成,并且去掉web相关代码支持

This commit is contained in:
2026-08-19 23:27:47 +08:00
parent d116814bb6
commit 81990385f4
13 changed files with 242 additions and 526 deletions
+2 -33
View File
@@ -1,4 +1,3 @@
// lib/pages/home_page.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../services/audio_service.dart';
@@ -7,7 +6,6 @@ import '../services/playback_service.dart';
import '../widgets/magnetic_scroll_physics.dart';
import 'webdav_setup_page.dart';
import 'webdav_file_list_page.dart';
import 'dart:async';
// ==================================================
// 歌曲数据模型
@@ -171,7 +169,6 @@ class _HomePageState extends State<HomePage> {
return (offset / _mediaLibraryHeight).clamp(0.0, 1.0);
}
// 媒体库透明度(快速淡出)
double get _mediaOpacity {
final p = _progress;
if (p <= 0.3) {
@@ -181,7 +178,6 @@ class _HomePageState extends State<HomePage> {
}
}
// 列表展开程度
double get _listReveal {
if (_progress <= 0.7) return 0.0;
return (_progress - 0.7) / 0.3;
@@ -204,7 +200,6 @@ class _HomePageState extends State<HomePage> {
super.dispose();
}
// ========== 高度测量(带重试限制) ==========
void _measureMediaLibraryHeight() {
final renderBox =
_mediaLibraryKey.currentContext?.findRenderObject() as RenderBox?;
@@ -231,12 +226,10 @@ class _HomePageState extends State<HomePage> {
}
}
// ========== 滚动监听 ==========
void _onScroll() {
if (mounted) setState(() {});
}
// ========== 初始化 WebDAV ==========
Future<void> _initWebDAV() async {
setState(() => _isLoading = true);
try {
@@ -249,14 +242,10 @@ class _HomePageState extends State<HomePage> {
}
}
// ============================================================
// ⭐ 核心:播放方法(UI 优先响应,然后真正播放)
// ============================================================
void _playSong(SongItem song) async {
try {
final url = WebDAVService.instance.getFileUrl(song.path);
// 1️⃣ 先更新 UI(立即响应)
final audioService = context.read<AudioService>();
audioService.playSong(Song(
id: song.path,
@@ -265,11 +254,9 @@ class _HomePageState extends State<HomePage> {
url: url,
));
// 2️⃣ 动态获取认证头
final headers = await WebDAVService.instance.getAuthHeaders();
if (headers.isEmpty) {
print('⚠️ 未获取到认证头,请检查 WebDAV 登录状态');
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
@@ -281,10 +268,6 @@ class _HomePageState extends State<HomePage> {
return;
}
print('🎵 [收藏列表] 播放 URL: $url');
print('📋 [收藏列表] 认证头已设置: ${headers.keys}');
// 3️⃣ 播放
await PlaybackService().play(url, headers: headers);
} catch (e) {
if (mounted) {
@@ -298,7 +281,6 @@ class _HomePageState extends State<HomePage> {
}
}
// ========== 重置磁吸状态 ==========
void _resetSnapState() {
if (_scrollController.hasClients) {
_scrollController.jumpTo(0.0);
@@ -306,21 +288,15 @@ class _HomePageState extends State<HomePage> {
setState(() {});
}
// ================================================================
// Build
// ================================================================
@override
Widget build(BuildContext context) {
final isConnected = WebDAVService.instance.isConnected;
final username = WebDAVService.instance.username ?? '点击连接';
final audioService = context.watch<AudioService>();
final showMiniBar = audioService.currentSong != null;
return Scaffold(
backgroundColor: const Color(0xFF0E1211),
body: Column(
children: [
// ---- 固定标题 "清听" ----
SafeArea(
bottom: false,
child: Padding(
@@ -344,8 +320,6 @@ class _HomePageState extends State<HomePage> {
),
),
),
// ---- 滚动区域 ----
Expanded(
child: CustomScrollView(
controller: _scrollController,
@@ -356,7 +330,6 @@ class _HomePageState extends State<HomePage> {
)
: const ClampingScrollPhysics(),
slivers: [
// ---- 媒体库 ----
SliverToBoxAdapter(
child: Opacity(
opacity: _mediaOpacity,
@@ -551,8 +524,6 @@ class _HomePageState extends State<HomePage> {
),
),
),
// ---- "我的收藏" Sticky Header ----
SliverPersistentHeader(
pinned: true,
delegate: _StickyHeaderDelegate(
@@ -578,13 +549,11 @@ class _HomePageState extends State<HomePage> {
),
),
),
// ---- 收藏列表 ----
SliverPadding(
padding: EdgeInsets.only(
padding: const EdgeInsets.only(
left: 20,
right: 20,
bottom: showMiniBar ? 80.0 : 20.0,
bottom: 20,
),
sliver: _isLoading
? const SliverFillRemaining(