From 2ce06054e84f171ec2eee57749855b74adf1a449 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Sat, 21 Jun 2025 10:23:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E9=9F=B3=E4=B9=90):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E9=9F=B3=E4=B9=90=E5=88=97=E8=A1=A8=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 MusicManager 和 MusicService 中添加 playPlaylist 方法 - 在 AgentController 中实现播放列表逻辑,包括加载状态管理 - 修复音乐播放视图中的当前播放歌曲ID比较问题 --- lib/data/services/music_manager.dart | 5 ++ .../agent/controllers/agent_controller.dart | 80 ++++++++++++++++++- .../music/views/music_playlist_view.dart | 2 +- .../music_service/lib/music_service.dart | 5 ++ 4 files changed, 89 insertions(+), 3 deletions(-) diff --git a/lib/data/services/music_manager.dart b/lib/data/services/music_manager.dart index 90324c290..26e7aef91 100644 --- a/lib/data/services/music_manager.dart +++ b/lib/data/services/music_manager.dart @@ -80,4 +80,9 @@ class MusicManager extends GetxService { Future seekTo(int positionMs) async { await _musicService.seekTo(positionMs); } + + /// 播放音乐列表 + Future playPlaylist(List> playlist) async { + await _musicService.playMusicPlaylist(playlist); + } } diff --git a/lib/modules/agent/controllers/agent_controller.dart b/lib/modules/agent/controllers/agent_controller.dart index add1f53b4..c6c58d704 100644 --- a/lib/modules/agent/controllers/agent_controller.dart +++ b/lib/modules/agent/controllers/agent_controller.dart @@ -85,6 +85,16 @@ class AgentController extends GetxController { // 是否已加载聊天记录 final isHistoryLoaded = false.obs; + // 添加加载状态跟踪 + final RxBool isLoadingMusic = false.obs; + final RxString loadingMusicId = ''.obs; + + // 设置加载状态的方法 + void setLoadingMusic(String id, bool loading) { + loadingMusicId.value = loading ? id : ''; + isLoadingMusic.value = loading; + } + @override void onInit() { super.onInit(); @@ -926,12 +936,14 @@ class AgentController extends GetxController { // 恢复音乐播放 Future musicResume() async { try { - Logger.d('AgentController', '恢复音乐播放'); + Logger.d('AgentController', '恢复播放音乐'); await _musiceManager.resume(); isPlaying.value = true; _startProgressTimer(); + Logger.d('AgentController', '音乐恢复播放成功'); } catch (e) { - Logger.e('AgentController', '恢复音乐失败: $e'); + Logger.e('AgentController', '恢复播放音乐失败: $e'); + isPlaying.value = false; } } @@ -1037,4 +1049,68 @@ class AgentController extends GetxController { ), ); } + + /// 播放音乐列表 + Future playPlaylist(List> playlist) async { + try { + if (playlist.isEmpty) { + Logger.e(TAG, '播放列表为空,无法播放'); + return; + } + + Logger.d(TAG, '开始播放音乐列表,共${playlist.length}首歌曲'); + + // 设置加载状态 + isLoadingMusic.value = true; + loadingMusicId.value = playlist[0]['id']?.toString() ?? ''; + + // 重置播放状态 + isPlaying.value = true; + currentPosition.value = 0; + duration.value = 0; + progress.value = 0.0; + + // 格式化歌曲列表数据 + final formattedPlaylist = playlist.map((song) { + return { + 'id': song['id']?.toString() ?? '', + 'url': song['url']?.toString() ?? '', + 'title': song['title']?.toString() ?? song['name']?.toString() ?? '', + 'artist': song['artist']?.toString() ?? song['sgener']?.toString() ?? '', + 'coverUrl': song['coverUrl']?.toString() ?? song['image']?.toString() ?? '', + }; + }).toList(); + + // 调用音乐管理器播放列表 + await _musiceManager.playPlaylist(formattedPlaylist); + + // 更新当前播放歌曲ID + if (formattedPlaylist.isNotEmpty) { + currentId.value = int.tryParse(formattedPlaylist[0]['id'] ?? '0') ?? 0; + } + + // 启动进度定时器 + _startProgressTimer(); + + Logger.d(TAG, '音乐列表播放启动成功'); + } catch (e) { + Logger.e(TAG, '播放音乐列表失败: $e'); + isPlaying.value = false; + currentId.value = 0; + + // 显示错误提示 + Get.snackbar( + '播放失败', + '无法播放音乐列表,请稍后重试', + snackPosition: SnackPosition.BOTTOM, + backgroundColor: Colors.red[400], + colorText: Colors.white, + duration: const Duration(seconds: 2), + ); + } finally { + // 清除加载状态 + isLoadingMusic.value = false; + loadingMusicId.value = ''; + } + } } diff --git a/lib/modules/music/views/music_playlist_view.dart b/lib/modules/music/views/music_playlist_view.dart index 022566802..a66d228a3 100644 --- a/lib/modules/music/views/music_playlist_view.dart +++ b/lib/modules/music/views/music_playlist_view.dart @@ -166,7 +166,7 @@ class MusicPlaylistView extends StatelessWidget { // 播放按钮 Obx(() { final isThisPlaying = - controller.isPlaying.value && controller.currentId.value == url; + controller.isPlaying.value && controller.currentId.value == id; // 只有当前播放的歌曲才显示进度 final currentProgress = diff --git a/local_plugins/music_service/lib/music_service.dart b/local_plugins/music_service/lib/music_service.dart index da5516b43..ac091afb0 100644 --- a/local_plugins/music_service/lib/music_service.dart +++ b/local_plugins/music_service/lib/music_service.dart @@ -74,4 +74,9 @@ class MusicService { Future seekTo(int positionMs) async { await _methodChannel.invokeMethod('seekTo', {'position': positionMs}); } + + /// 播放音乐列表 + Future playMusicPlaylist(List> songs) async { + await _methodChannel.invokeMethod('playlist', {'songs': songs}); + } }