Browse Source

feat(音乐): 添加播放音乐列表功能

- 在 MusicManager 和 MusicService 中添加 playPlaylist 方法
- 在 AgentController 中实现播放列表逻辑,包括加载状态管理
- 修复音乐播放视图中的当前播放歌曲ID比较问题
weicu
lxm 1 year ago
parent
commit
2ce06054e8
  1. 5
      lib/data/services/music_manager.dart
  2. 80
      lib/modules/agent/controllers/agent_controller.dart
  3. 2
      lib/modules/music/views/music_playlist_view.dart
  4. 5
      local_plugins/music_service/lib/music_service.dart

5
lib/data/services/music_manager.dart

@ -80,4 +80,9 @@ class MusicManager extends GetxService {
Future<void> seekTo(int positionMs) async {
await _musicService.seekTo(positionMs);
}
/// 播放音乐列表
Future<void> playPlaylist(List<Map<String, dynamic>> playlist) async {
await _musicService.playMusicPlaylist(playlist);
}
}

80
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<void> 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<void> playPlaylist(List<Map<String, dynamic>> 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 = '';
}
}
}

2
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 =

5
local_plugins/music_service/lib/music_service.dart

@ -74,4 +74,9 @@ class MusicService {
Future<void> seekTo(int positionMs) async {
await _methodChannel.invokeMethod('seekTo', {'position': positionMs});
}
/// 播放音乐列表
Future<void> playMusicPlaylist(List<Map<String, dynamic>> songs) async {
await _methodChannel.invokeMethod('playlist', {'songs': songs});
}
}

Loading…
Cancel
Save