From 7c394dd8fa5c1fdf8815653a33507a653db76655 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Wed, 6 Aug 2025 12:50:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0qq=E9=9F=B3=E4=B9=90=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/qq_musoc.dart | 36 ++- .../agent/controllers/agent_controller.dart | 2 +- lib/modules/agent/views/message_bubble.dart | 19 +- lib/modules/agent/views/qqmusic_card.dart | 67 ++--- .../qqmusic_playlist_controller.dart | 239 ++++++++++++------ .../qqmusic/views/qqmusic_playlist_view.dart | 61 ++--- 6 files changed, 243 insertions(+), 181 deletions(-) diff --git a/lib/data/services/qq_musoc.dart b/lib/data/services/qq_musoc.dart index 11f3b37ed..67a537a93 100644 --- a/lib/data/services/qq_musoc.dart +++ b/lib/data/services/qq_musoc.dart @@ -16,8 +16,8 @@ class QqMusocService extends GetxService { final currentPosition = 0.obs; // 毫秒 final totalDuration = 0.obs; // 毫秒 final currentSong = Rxn(); - final playlist = [].obs; - final currentIndex = 0.obs; + // final playlist = [].obs; + // final currentIndex = 0.obs; // 状态监听定时器 Timer? _stateMonitorTimer; @@ -259,12 +259,6 @@ class QqMusocService extends GetxService { ); if (result['success'] == true) { - // 更新全局状态 - if (songList != null) { - playlist.assignAll(songList); - currentIndex.value = index; - } - if (currentSongModel != null) { currentSong.value = currentSongModel; totalDuration.value = currentSongModel.duration; @@ -274,8 +268,8 @@ class QqMusocService extends GetxService { currentPosition.value = 0; // 启动全局状态监听 - print('🎵 [QQMusicService] 开始播放,启动全局状态监听'); - startPlaybackStateMonitor(); + // print('🎵 [QQMusicService] 开始播放,启动全局状态监听'); + syncCurrentPlayInfo(); _notifyListeners(); } @@ -352,10 +346,10 @@ class QqMusocService extends GetxService { final result = await _qqMusic.skipToNext(); if (result['success'] == true) { // 更新当前索引 - if (currentIndex.value < playlist.length - 1) { - currentIndex.value++; - currentSong.value = playlist[currentIndex.value]; - } + // if (currentIndex.value < playlist.length - 1) { + // currentIndex.value++; + // currentSong.value = playlist[currentIndex.value]; + // } _notifyListeners(); } return result; @@ -370,10 +364,10 @@ class QqMusocService extends GetxService { final result = await _qqMusic.skipToPrevious(); if (result['success'] == true) { // 更新当前索引 - if (currentIndex.value > 0) { - currentIndex.value--; - currentSong.value = playlist[currentIndex.value]; - } + // if (currentIndex.value > 0) { + // currentIndex.value--; + // currentSong.value = playlist[currentIndex.value]; + // } _notifyListeners(); } return result; @@ -415,6 +409,7 @@ class QqMusocService extends GetxService { /// 同步当前播放信息 - 统一接口 Future> syncCurrentPlayInfo() async { try { + _stateMonitorTimer?.cancel(); //先关闭计时器 final result = await _qqMusic.syncCurrentPlayInfo(); // 如果同步成功,更新全局状态 @@ -457,7 +452,10 @@ class QqMusocService extends GetxService { currentSong.value = newSong; } } - + if (newIsPlaying) { + //正在播放 + startPlaybackStateMonitor(); + } // 通知所有监听器 _notifyListeners(); } diff --git a/lib/modules/agent/controllers/agent_controller.dart b/lib/modules/agent/controllers/agent_controller.dart index 0bd98ea68..ab93538d3 100644 --- a/lib/modules/agent/controllers/agent_controller.dart +++ b/lib/modules/agent/controllers/agent_controller.dart @@ -159,7 +159,7 @@ class AgentController extends GetxController { startVoiceInput(); //开启语音输入 - _qqmusicManager.syncCurrentPlayInfo(); + // _qqmusicManager.syncCurrentPlayInfo(); } // 初始化音乐播放状态 diff --git a/lib/modules/agent/views/message_bubble.dart b/lib/modules/agent/views/message_bubble.dart index f5d602616..e95f14a64 100644 --- a/lib/modules/agent/views/message_bubble.dart +++ b/lib/modules/agent/views/message_bubble.dart @@ -1,8 +1,9 @@ +import 'package:voitrans/core/utils/logger.dart'; import 'package:voitrans/modules/agent/views/qqmusic_card.dart'; +import '../../../data/models/song_model.dart'; import '../../../modules/agent/views/navigation_card.dart'; import 'weather_card.dart'; -import 'music_card.dart'; import 'travel_card.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -258,10 +259,20 @@ class MessageBubble extends GetView { if (data != null && data is List) { //qq音乐 final rawList = data as List? ?? []; - final playlist = - rawList.map((e) => Map.from(e)).toList(); + final songList = rawList + .map((item) { + try { + return SongModel.fromJson(item); + } catch (e) { + Logger.e('QQMusicPlaylist', '解析歌曲数据失败: $e, 数据: $item'); + return null; + } + }) + .where((song) => song != null) + .cast() + .toList(); //音乐播放列表 - return buildQQMusicContent(context, playlist); + return buildQQMusicContent(context, songList); } } else if (meta!.keys.contains('maps_weather')) { final maps_weather = meta!['maps_weather'] as Map; diff --git a/lib/modules/agent/views/qqmusic_card.dart b/lib/modules/agent/views/qqmusic_card.dart index 81b5b9846..d5d20d6cc 100644 --- a/lib/modules/agent/views/qqmusic_card.dart +++ b/lib/modules/agent/views/qqmusic_card.dart @@ -8,20 +8,10 @@ import 'circular_progress_button.dart'; /// 构建音乐项目 Widget buildQQMusicItem( - BuildContext context, String id, String name, String singer, String image) { + BuildContext context, List songs, SongModel song, int index) { final qqMusicService = QqMusocService.to; // 使用QQ音乐全局服务 final isDarkMode = Theme.of(context).brightness == Brightness.dark; - // 创建SongModel对象 - 修复字段名 - final song = SongModel( - mid: id, - name: name, - artist: singer, // 修复:使用 artist 而不是 singer - album: '', // 添加必需的 album 字段 - duration: 0, // 默认时长,实际播放时会更新 - albumPic: image, // 修复:使用 albumPic 而不是 pic - ); - return Container( padding: EdgeInsets.all(14.w), decoration: BoxDecoration( @@ -44,14 +34,14 @@ Widget buildQQMusicItem( decoration: BoxDecoration( color: isDarkMode ? Colors.grey[800] : Colors.grey[100], borderRadius: BorderRadius.circular(8.r), - image: image.isNotEmpty + image: song.albumPic!.isNotEmpty ? DecorationImage( - image: NetworkImage(image), + image: NetworkImage(song.albumPic!), fit: BoxFit.cover, ) : null, ), - child: image.isEmpty + child: song.albumPic!.isEmpty ? Icon( Icons.music_note, size: 18.sp, @@ -65,7 +55,7 @@ Widget buildQQMusicItem( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - name, + song.name, style: TextStyle( fontSize: 13.sp, fontWeight: FontWeight.w500, @@ -77,7 +67,7 @@ Widget buildQQMusicItem( ), SizedBox(height: 2.h), Text( - singer, + song.artist, style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.grey[400] : Colors.grey[600], @@ -90,7 +80,7 @@ Widget buildQQMusicItem( Obx(() { // 使用QQ音乐服务的全局状态 final isThisPlaying = qqMusicService.isPlaying.value && - qqMusicService.currentSong.value?.mid == id; + qqMusicService.currentSong.value?.mid == song.mid; // 计算播放进度 final currentProgress = @@ -109,27 +99,29 @@ Widget buildQQMusicItem( onPlayPause: () async { try { if (qqMusicService.isPlaying.value) { - if (qqMusicService.currentSong.value?.mid == id) { + if (qqMusicService.currentSong.value?.mid == song.mid) { // 当前歌曲正在播放,暂停它 await qqMusicService.pauseMusic(); } else { + final songMids = songs.map((s) => s.mid).toList(); // 其他歌曲正在播放,播放这首歌 await qqMusicService.playSongs( - songMids: [id], - index: 0, + songMids: songMids, + index: index, songList: [song], currentSongModel: song, ); } } else { - if (qqMusicService.currentSong.value?.mid == id) { + if (qqMusicService.currentSong.value?.mid == song.mid) { // 当前歌曲已暂停,恢复播放 await qqMusicService.resumeMusic(); } else { + final songMids = songs.map((s) => s.mid).toList(); // 播放新歌曲 await qqMusicService.playSongs( - songMids: [id], - index: 0, + songMids: songMids, + index: index, songList: [song], currentSongModel: song, ); @@ -155,23 +147,8 @@ Widget buildQQMusicItem( } /// 构建音乐内容卡片 -Widget buildQQMusicContent( - BuildContext context, List> playlist) { +Widget buildQQMusicContent(BuildContext context, List songs) { final isDarkMode = Theme.of(context).brightness == Brightness.dark; - final qqMusicService = QqMusocService.to; // 使用QQ音乐全局服务 - - // 将播放列表转换为SongModel列表 - 修复字段名 - final songList = playlist - .map((item) => SongModel( - mid: item["mid"] ?? "", - name: item["name"] ?? "未知歌曲", - artist: item["singer"] ?? "未知歌手", // 修复:使用 artist 而不是 singer - album: '', // 添加必需的 album 字段 - duration: 0, - albumPic: item["pic"] ?? "", // 修复:使用 albumPic 而不是 pic - )) - .toList(); - return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -213,17 +190,13 @@ Widget buildQQMusicContent( const SizedBox(height: 10), // 动态生成音乐条目 - ...playlist.asMap().entries.take(4).map((entry) { + ...songs.asMap().entries.take(4).map((entry) { final index = entry.key; final item = entry.value; - final mid = item["mid"]; - final name = item["name"] ?? "未知歌曲"; - final singer = item["singer"] ?? "未知歌手"; - final image = item["pic"] ?? ""; return Column( children: [ - buildQQMusicItem(context, mid, name, singer, image), - if (index != playlist.length - 1) + buildQQMusicItem(context, songs, item, index), + if (index != songs.length - 1) Divider( height: 1, thickness: 1, @@ -239,7 +212,7 @@ Widget buildQQMusicContent( child: TextButton( onPressed: () { // 跳转到完整歌单页面,传递完整的歌单数据 - Get.toNamed(Routes.qqmusic, arguments: {"playlist": playlist}); + Get.toNamed(Routes.qqmusic, arguments: {"playlist": songs}); }, style: TextButton.styleFrom( minimumSize: Size.zero, diff --git a/lib/modules/qqmusic/controllers/qqmusic_playlist_controller.dart b/lib/modules/qqmusic/controllers/qqmusic_playlist_controller.dart index 32f0fc179..dce3ed7e2 100644 --- a/lib/modules/qqmusic/controllers/qqmusic_playlist_controller.dart +++ b/lib/modules/qqmusic/controllers/qqmusic_playlist_controller.dart @@ -12,112 +12,123 @@ class QQMusicPlaylistController extends GetxController { final isLoggedIn = false.obs; final userInfo = Rxn>(); - // 直接使用全局服务的状态 - 修复返回类型 - RxBool get isPlaying => _qqMusicService.isPlaying; + // 界面维护的播放列表状态 + RxList playlist = [].obs; + RxInt currentIndex = 0.obs; + + // 界面显示的当前歌曲(可能与实际播放的不同) + Rxn displayCurrentSong = Rxn(); + + // 界面播放状态(当前播放歌曲不在列表中时为未播放状态) + RxBool displayIsPlaying = false.obs; + + // 从全局服务获取实际播放状态(仅用于同步) + RxBool get actualIsPlaying => _qqMusicService.isPlaying; RxInt get currentPosition => _qqMusicService.currentPosition; RxInt get totalDuration => _qqMusicService.totalDuration; - Rxn get currentSong => _qqMusicService.currentSong; - RxList get playlist => _qqMusicService.playlist; - RxInt get currentIndex => _qqMusicService.currentIndex; + Rxn get actualCurrentSong => _qqMusicService.currentSong; @override void onInit() { super.onInit(); - - // 使用 WidgetsBinding.instance.addPostFrameCallback 延迟执行状态更新 - WidgetsBinding.instance.addPostFrameCallback((_) { - _initializePlaylist(); - }); - + _initializePlaylist(); print('🎵 [QQMusicPlaylistController] 控制器初始化完成'); } - /// 初始化播放列表 - 延迟执行避免构建期间状态更新 + /// 初始化播放列表 void _initializePlaylist() { // 从路由参数获取播放列表 final arguments = Get.arguments; if (arguments != null && arguments['playlist'] != null) { - final List playlistData = 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}'); - - // 更新播放列表 - _qqMusicService.playlist.assignAll(songList); - - // 安全地设置当前歌曲 - if (songList.isNotEmpty) { - _qqMusicService.currentSong.value = songList.first; - _qqMusicService.currentIndex.value = 0; - Logger.d('QQMusicPlaylist', '设置当前歌曲: ${songList.first.name}'); - } else { - _qqMusicService.currentSong.value = null; - _qqMusicService.currentIndex.value = 0; - Logger.w('QQMusicPlaylist', '播放列表为空,无法设置当前歌曲'); - } - } catch (e) { - Logger.e('QQMusicPlaylist', '处理播放列表时发生异常: $e'); - // 确保状态一致性 - _qqMusicService.currentSong.value = null; - _qqMusicService.currentIndex.value = 0; - } + 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', '未接收到播放列表参数'); - } - - // 确保 playlist 初始化 - if (_qqMusicService.playlist.isEmpty) { - Logger.w('QQMusicPlaylist', 'Playlist is empty on init'); + _setDefaultDisplayState(); } // 添加状态监听器 _qqMusicService.addListener(_onMusicStateChanged); // 界面初始化时同步播放状态和进度 - _syncInitialState(); + _qqMusicService.syncCurrentPlayInfo(); } - /// 同步初始播放状态 - 移除 update() 调用 - Future _syncInitialState() async { - try { - Logger.d('QQMusicPlaylist', '开始同步初始播放状态'); + /// 同步显示状态与实际播放状态 + void _syncDisplayStateWithActualPlayback() { + if (playlist.isEmpty) { + _setDefaultDisplayState(); + return; + } - // 同步当前播放信息 - await _qqMusicService.syncCurrentPlayInfo(); + final actualSong = actualCurrentSong.value; - // 如果当前有音乐在播放,启动状态监听 - if (_qqMusicService.isPlaying.value) { - Logger.d('QQMusicPlaylist', '检测到音乐正在播放,启动状态监听'); - _qqMusicService.startPlaybackStateMonitor(); - } + if (actualSong != null) { + // 查找当前播放歌曲在列表中的位置 + final index = playlist.indexWhere((song) => song.mid == actualSong.mid); - // 移除这行,避免在构建期间调用 update() - // update(); + if (index != -1) { + // 当前播放歌曲在列表中 + currentIndex.value = index; + displayCurrentSong.value = playlist[index]; + displayIsPlaying.value = actualIsPlaying.value; + Logger.d('QQMusicPlaylist', '当前播放歌曲在列表中,索引: $index'); + } else { + // 当前播放歌曲不在列表中,显示列表第一个,状态为未播放 + _setDefaultDisplayState(); + Logger.d('QQMusicPlaylist', '当前播放歌曲不在列表中,显示默认状态'); + } + } else { + // 没有当前播放歌曲,显示列表第一个,状态为未播放 + _setDefaultDisplayState(); + Logger.d('QQMusicPlaylist', '无当前播放歌曲,显示默认状态'); + } + } - Logger.d('QQMusicPlaylist', '初始状态同步完成'); - } catch (e) { - Logger.e('QQMusicPlaylist', '初始状态同步失败: $e'); + /// 设置默认显示状态 + void _setDefaultDisplayState() { + if (playlist.isNotEmpty) { + currentIndex.value = 0; + displayCurrentSong.value = playlist.first; + displayIsPlaying.value = false; // 默认为未播放状态 + Logger.d('QQMusicPlaylist', '设置默认显示状态: ${playlist.first.name}'); + } else { + currentIndex.value = 0; + displayCurrentSong.value = null; + displayIsPlaying.value = false; + Logger.w('QQMusicPlaylist', '播放列表为空,无法设置默认状态'); } } - /// 音乐状态变化回调 - 使用 SchedulerBinding 延迟更新 + /// 音乐状态变化回调 void _onMusicStateChanged() { - // 使用 SchedulerBinding 确保在构建完成后再更新 SchedulerBinding.instance.addPostFrameCallback((_) { if (!isClosed) { + // 重新同步显示状态 + _syncDisplayStateWithActualPlayback(); update(); } }); @@ -133,7 +144,7 @@ class QQMusicPlaylistController extends GetxController { /// 播放歌曲 Future playSong(SongModel song, {List? songList}) async { try { - // 如果没有传入歌曲列表,使用当前播放列表 + // 使用传入的歌曲列表或当前播放列表 final List finalSongList = songList ?? playlist.toList(); final songMids = finalSongList.map((s) => s.mid).toList(); final playIndex = finalSongList.indexOf(song); @@ -149,6 +160,7 @@ class QQMusicPlaylistController extends GetxController { ); if (result['success'] == true) { + // 播放成功后,如果歌曲不在当前列表中,保持列表显示状态不变 Get.snackbar('开始播放', song.name); } else { Get.snackbar('播放失败', result['error'] ?? '未知错误'); @@ -156,6 +168,10 @@ class QQMusicPlaylistController extends GetxController { return; } + // 歌曲在当前列表中,更新界面状态 + currentIndex.value = playIndex; + displayCurrentSong.value = song; + final result = await _qqMusicService.playSongs( songMids: songMids, index: playIndex, @@ -164,41 +180,102 @@ class QQMusicPlaylistController extends GetxController { ); if (result['success'] == true) { + displayIsPlaying.value = true; + _qqMusicService.syncCurrentPlayInfo(); Get.snackbar('开始播放', song.name); } else { + displayIsPlaying.value = false; Get.snackbar('播放失败', result['error'] ?? '未知错误'); } } catch (e) { + displayIsPlaying.value = false; Get.snackbar('播放失败', e.toString()); } } + /// 播放列表中的指定歌曲 + Future playPlaylistSong(int index) async { + if (index >= 0 && index < playlist.length) { + await playSong(playlist[index]); + } + } + /// 暂停/继续播放 Future togglePlayPause() async { - if (isPlaying.value) { - await _qqMusicService.pauseMusic(); + // 检查当前显示的歌曲是否正在播放 + final displaySong = displayCurrentSong.value; + final actualSong = actualCurrentSong.value; + + if (displaySong != null && + actualSong != null && + displaySong.mid == actualSong.mid) { + // 显示的歌曲正在播放,执行暂停/继续 + if (actualIsPlaying.value) { + await _qqMusicService.pauseMusic(); + displayIsPlaying.value = false; + } else { + await _qqMusicService.resumeMusic(); + displayIsPlaying.value = true; + } } else { - await _qqMusicService.resumeMusic(); + // 显示的歌曲不是当前播放的,播放显示的歌曲 + if (displaySong != null) { + await playSong(displaySong); + } } } - /// 下一首 + /// 下一首(列表内) Future nextSong() async { - await _qqMusicService.skipToNext(); + if (playlist.isNotEmpty) { + final nextIndex = (currentIndex.value + 1) % playlist.length; + await playPlaylistSong(nextIndex); + } } - /// 上一首 + /// 上一首(列表内) Future previousSong() async { - await _qqMusicService.skipToPrevious(); + if (playlist.isNotEmpty) { + final prevIndex = + currentIndex.value > 0 ? currentIndex.value - 1 : playlist.length - 1; + await playPlaylistSong(prevIndex); + } } /// 停止播放 Future stopMusic() async { await _qqMusicService.stopMusic(); + displayIsPlaying.value = false; } /// 格式化时间 String formatDuration(int milliseconds) { return _qqMusicService.formatDuration(milliseconds); } + + /// 获取当前显示的播放状态(用于UI显示) + bool get isCurrentSongPlaying { + final displaySong = displayCurrentSong.value; + final actualSong = actualCurrentSong.value; + + // 只有当显示的歌曲与实际播放的歌曲相同时,才显示播放状态 + if (displaySong != null && + actualSong != null && + displaySong.mid == actualSong.mid) { + return actualIsPlaying.value; + } + return false; + } + + /// 检查歌曲是否在当前播放列表中 + bool isSongInPlaylist(SongModel song) { + return playlist.any((s) => s.mid == song.mid); + } + + /// 更新播放列表(支持多个播放列表场景) + void updatePlaylist(List newPlaylist) { + playlist.assignAll(newPlaylist); + _syncDisplayStateWithActualPlayback(); + Logger.d('QQMusicPlaylist', '播放列表已更新,歌曲数量: ${newPlaylist.length}'); + } } diff --git a/lib/modules/qqmusic/views/qqmusic_playlist_view.dart b/lib/modules/qqmusic/views/qqmusic_playlist_view.dart index b5dddfe02..62ea017ec 100644 --- a/lib/modules/qqmusic/views/qqmusic_playlist_view.dart +++ b/lib/modules/qqmusic/views/qqmusic_playlist_view.dart @@ -26,7 +26,7 @@ class QqmusicPlaylistView extends GetView { elevation: 0, ), backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], - body: controller.playlist.isEmpty || controller.currentSong.value == null + body: controller.playlist.isEmpty ? Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -71,9 +71,9 @@ class QqmusicPlaylistView extends GetView { Widget _buildCurrentPlayingSection(bool isDarkMode) { return SingleChildScrollView( child: Obx(() { - // 添加空值检查 - final currentSong = controller.currentSong.value; - if (currentSong == null) { + // 使用 displayCurrentSong 而不是 actualCurrentSong + final displayCurrentSong = controller.displayCurrentSong.value; + if (displayCurrentSong == null) { return Container( padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 12.h), child: Column( @@ -102,12 +102,13 @@ class QqmusicPlaylistView extends GetView { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - // 封面图片 - 现在安全了 - _buildCoverImage(currentSong.albumPic ?? '', isDarkMode, + // 封面图片 - 使用 displayCurrentSong + _buildCoverImage(displayCurrentSong.albumPic ?? '', isDarkMode, size: 110.w), SizedBox(height: 12.h), - // 歌曲信息 - 现在安全了 - _buildSongInfo(currentSong.name, currentSong.artist, isDarkMode), + // 歌曲信息 - 使用 displayCurrentSong + _buildSongInfo(displayCurrentSong.name, displayCurrentSong.artist, + isDarkMode), SizedBox(height: 16.h), // 进度条 _buildProgressBar(isDarkMode), @@ -259,18 +260,18 @@ class QqmusicPlaylistView extends GetView { SizedBox(width: 14.w), // 播放按钮 Obx(() { - // 使用 currentSong 的 mid 来判断是否是当前播放的歌曲 - final isThisPlaying = controller.isPlaying.value && - controller.currentSong.value?.mid == song.mid; + // 使用 actualCurrentSong 的 mid 来判断是否是当前播放的歌曲 + final isThactualIsPlaying = controller.actualIsPlaying.value && + controller.actualCurrentSong.value?.mid == song.mid; - final currentProgress = isThisPlaying + final currentProgress = isThactualIsPlaying ? controller.totalDuration.value > 0 ? controller.currentPosition.value / controller.totalDuration.value : 0.0 : 0.0; return CircularProgressButton( - isPlaying: isThisPlaying, + isPlaying: isThactualIsPlaying, progress: currentProgress, primaryColor: Theme.of(context).primaryColor, backgroundColor: Colors.grey, @@ -279,11 +280,11 @@ class QqmusicPlaylistView extends GetView { onPlayPause: () async { try { Logger.d('MusicPlaylistView', - '播放按钮被点击,当前播放状态: ${controller.isPlaying.value}'); + '播放按钮被点击,当前播放状态: ${controller.actualIsPlaying.value}'); Logger.d('MusicPlaylistView', - '当前歌曲ID: ${controller.currentSong.value?.mid}, 点击歌曲ID: ${song.mid}'); - if (controller.isPlaying.value) { - if (controller.currentSong.value?.mid == song.mid) { + '当前歌曲ID: ${controller.actualCurrentSong.value?.mid}, 点击歌曲ID: ${song.mid}'); + if (controller.actualIsPlaying.value) { + if (controller.actualCurrentSong.value?.mid == song.mid) { Logger.d('MusicPlaylistView', '暂停当前播放的歌曲'); await controller.togglePlayPause(); } else { @@ -298,7 +299,7 @@ class QqmusicPlaylistView extends GetView { Logger.e('MusicPlaylistView', '播放音乐时发生错误: $e'); } }, - onSeek: isThisPlaying ? (seekProgress) {} : null, + onSeek: isThactualIsPlaying ? (seekProgress) {} : null, ); }), ], @@ -431,11 +432,11 @@ class QqmusicPlaylistView extends GetView { // 构建迷你播放器 - 参考qqmusic_test的设计 Widget _buildMiniPlayer(bool isDarkMode) { return Obx(() { - if (controller.currentSong.value == null) { + if (controller.actualCurrentSong.value == null) { return const SizedBox.shrink(); } - final song = controller.currentSong.value!; + final song = controller.actualCurrentSong.value!; return Container( height: 80.h, decoration: BoxDecoration( @@ -506,7 +507,7 @@ class QqmusicPlaylistView extends GetView { ), IconButton( icon: Icon( - controller.isPlaying.value + controller.actualIsPlaying.value ? Icons.pause : Icons.play_arrow, ), @@ -569,7 +570,9 @@ class QqmusicPlaylistView extends GetView { }, padding: EdgeInsets.zero, icon: Icon( - controller.isPlaying.value ? Icons.pause : Icons.play_arrow, + controller.actualIsPlaying.value + ? Icons.pause + : Icons.play_arrow, size: 28.w, color: Colors.white, ), @@ -602,13 +605,13 @@ class QqmusicPlaylistView extends GetView { } // 播放/暂停切换 - Future _togglePlayPause(AgentController controller) async { - if (controller.isPlaying.value) { - await controller.musicPause(); - } else { - await controller.musicResume(); - } - } + // Future _togglePlayPause() async { + // if (controller.actualIsPlaying.value) { + // await controller.musicPause(); + // } else { + // await controller.musicResume(); + // } + // } // 播放上一曲 Future _playPrevious(