From f296d7aa3468f4ebae7b27b8e55a43b91ad5fc40 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Thu, 14 Aug 2025 18:59:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E8=8B=B9=E6=9E=9C=E7=9A=84qq?= =?UTF-8?q?=E9=9F=B3=E4=B9=90=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/qq_musoc.dart | 19 +++++--- lib/modules/agent/views/qqmusic_card.dart | 24 ++-------- .../qqmusic_playlist_controller.dart | 48 ++----------------- .../qqmusic/views/qqmusic_playlist_view.dart | 11 +++-- 4 files changed, 27 insertions(+), 75 deletions(-) diff --git a/lib/data/services/qq_musoc.dart b/lib/data/services/qq_musoc.dart index b5f1c8c9a..13d16fed3 100644 --- a/lib/data/services/qq_musoc.dart +++ b/lib/data/services/qq_musoc.dart @@ -94,7 +94,7 @@ class QqMusocService extends GetxService { _syncPlaybackInfo(); // 改为每2-3秒同步一次,减少频率 - _stateMonitorTimer = Timer.periodic(const Duration(seconds: 2), (timer) { + _stateMonitorTimer = Timer.periodic(const Duration(seconds: 1), (timer) { _syncPlaybackInfo(); }); @@ -255,26 +255,31 @@ class QqMusocService extends GetxService { SongModel? currentSongModel, }) async { try { + stopPlaybackStateMonitor(); + isPlaying.value = true; + currentPosition.value = 0; + currentSong.value = currentSongModel; final result = await _qqMusic.playSongs( songMids: songMids, index: index, ); - + print('💥 [QQMusicService] playSongs: $result'); if (result['success'] == true) { if (currentSongModel != null) { currentSong.value = currentSongModel; totalDuration.value = currentSongModel.duration; } - isPlaying.value = true; currentPosition.value = 0; - // 启动全局状态监听 - Future.delayed(Duration(milliseconds: 500), () { + Future.delayed(Duration(seconds: 1), () { syncCurrentPlayInfo(); }); - _notifyListeners(); + } else { + isPlaying.value = false; + currentPosition.value = 0; + currentSong.value = null; } return result; @@ -419,7 +424,7 @@ class QqMusocService extends GetxService { try { _stateMonitorTimer?.cancel(); //先关闭计时器 final result = await _qqMusic.syncCurrentPlayInfo(); - + print('💥 [QQMusicService] syncCurrentPlayInfo: $result'); // 如果同步成功,更新全局状态 if (result['success'] == true && result['data'] != null) { final data = result['data']; diff --git a/lib/modules/agent/views/qqmusic_card.dart b/lib/modules/agent/views/qqmusic_card.dart index f901d67c2..7d7581575 100644 --- a/lib/modules/agent/views/qqmusic_card.dart +++ b/lib/modules/agent/views/qqmusic_card.dart @@ -122,49 +122,35 @@ Widget buildQQMusicItem( backgroundColor: Colors.grey, size: 36.0, strokeWidth: 2.0, - onPlayPause: () async { + onPlayPause: () { try { if (qqMusicService.isPlaying.value) { if (qqMusicService.currentSong.value?.mid == song.mid) { // 当前歌曲正在播放,暂停它 - await qqMusicService.pauseMusic(); + qqMusicService.pauseMusic(); } else { final songMids = songs.map((s) => s.mid).toList(); // 其他歌曲正在播放,播放这首歌 - final result = await qqMusicService.playSongs( + qqMusicService.playSongs( songMids: songMids, index: index, songList: [song], currentSongModel: song, ); - if (result['success'] == true) { - // 播放成功后,如果歌曲不在当前列表中,保持列表显示状态不变 - Get.snackbar('开始播放', song.name); - // qqMusicService.syncCurrentPlayInfo(); - } else { - Get.snackbar('播放失败', result['error'] ?? '未知错误'); - } } } else { if (qqMusicService.currentSong.value?.mid == song.mid) { // 当前歌曲已暂停,恢复播放 - await qqMusicService.resumeMusic(); + qqMusicService.resumeMusic(); } else { final songMids = songs.map((s) => s.mid).toList(); // 播放新歌曲 - final result = await qqMusicService.playSongs( + qqMusicService.playSongs( songMids: songMids, index: index, songList: [song], currentSongModel: song, ); - if (result['success'] == true) { - // 播放成功后,如果歌曲不在当前列表中,保持列表显示状态不变 - Get.snackbar('开始播放', song.name); - // qqMusicService.syncCurrentPlayInfo(); - } else { - Get.snackbar('播放失败', result['error'] ?? '未知错误'); - } } } } catch (e) { diff --git a/lib/modules/qqmusic/controllers/qqmusic_playlist_controller.dart b/lib/modules/qqmusic/controllers/qqmusic_playlist_controller.dart index 598cf5050..c290a186c 100644 --- a/lib/modules/qqmusic/controllers/qqmusic_playlist_controller.dart +++ b/lib/modules/qqmusic/controllers/qqmusic_playlist_controller.dart @@ -41,30 +41,10 @@ class QQMusicPlaylistController extends GetxController { final arguments = Get.arguments; if (arguments != null && arguments['playlist'] != null) { final List songList = arguments['playlist']; - // try { - // // 解析播放列表数据 - // final songList = playlistData - // .map((item) { - // try { - // return SongModel.fromJson(item); - // } catch (e) { - // Logger.e('QQMusicPlaylist', '解析歌曲数据失败: $e, 数据: $item'); - // return null; - // } - // }) - // .where((song) => song != null) - // .cast() - // .toList(); - - // Logger.d('QQMusicPlaylist', '成功解析歌曲数量: ${songList.length}'); // 更新播放列表 playlist.assignAll(songList); // 检查当前播放歌曲是否在列表中 _syncDisplayStateWithActualPlayback(); - // } catch (e) { - // Logger.e('QQMusicPlaylist', '处理播放列表时发生异常: $e'); - // _setDefaultDisplayState(); - // } } else { Logger.w('QQMusicPlaylist', '未接收到播放列表参数'); _setDefaultDisplayState(); @@ -150,31 +130,9 @@ class QQMusicPlaylistController extends GetxController { final songMids = finalSongList.map((s) => s.mid).toList(); final playIndex = finalSongList.indexOf(song); - // 如果歌曲不在当前列表中,则只播放这一首 - if (playIndex == -1) { - final singleSongList = [song]; - final result = await _qqMusicService.playSongs( - songMids: [song.mid], - index: 0, - songList: singleSongList, - currentSongModel: song, - ); - - if (result['success'] == true) { - // 播放成功后,如果歌曲不在当前列表中,保持列表显示状态不变 - Get.snackbar('开始播放', song.name); - // _qqMusicService.syncCurrentPlayInfo(); - } else { - Get.snackbar('播放失败', result['error'] ?? '未知错误'); - displayIsPlaying.value = false; - } - return; - } - // 歌曲在当前列表中,更新界面状态 currentIndex.value = playIndex; displayCurrentSong.value = song; - final result = await _qqMusicService.playSongs( songMids: songMids, index: playIndex, @@ -185,14 +143,14 @@ class QQMusicPlaylistController extends GetxController { if (result['success'] == true) { displayIsPlaying.value = true; // _qqMusicService.syncCurrentPlayInfo(); - Get.snackbar('开始播放', song.name); + // Get.snackbar('开始播放', song.name); } else { displayIsPlaying.value = false; - Get.snackbar('播放失败', result['error'] ?? '未知错误'); + // Get.snackbar('播放失败', result['error'] ?? '未知错误'); } } catch (e) { displayIsPlaying.value = false; - Get.snackbar('播放失败', e.toString()); + // Get.snackbar('播放失败', e.toString()); } } diff --git a/lib/modules/qqmusic/views/qqmusic_playlist_view.dart b/lib/modules/qqmusic/views/qqmusic_playlist_view.dart index 062b56466..69b5f263a 100644 --- a/lib/modules/qqmusic/views/qqmusic_playlist_view.dart +++ b/lib/modules/qqmusic/views/qqmusic_playlist_view.dart @@ -163,7 +163,8 @@ class QqmusicPlaylistView extends GetView { itemCount: controller.playlist.length, itemBuilder: (context, index) { final song = controller.playlist[index]; - return _buildMusicItem(context, song, isDarkMode); + return _buildMusicItem( + context, controller.playlist, song, index, isDarkMode); }, ); }, @@ -172,12 +173,14 @@ class QqmusicPlaylistView extends GetView { Widget _buildMusicItem( BuildContext context, + List songs, SongModel song, + int index, bool isDarkMode, ) { return GestureDetector( onTap: () async { - await controller.playSong(song); + await controller.playSong(song, songList: songs); }, child: Container( margin: EdgeInsets.only(bottom: 10.h), @@ -309,11 +312,11 @@ class QqmusicPlaylistView extends GetView { await controller.togglePlayPause(); } else { Logger.d('MusicPlaylistView', '播放新歌曲'); - await controller.playSong(song); + await controller.playSong(song, songList: songs); } } else { Logger.d('MusicPlaylistView', '开始播放歌曲'); - await controller.playSong(song); + await controller.playSong(song, songList: songs); } } catch (e) { Logger.e('MusicPlaylistView', '播放音乐时发生错误: $e');