|
|
@ -85,6 +85,16 @@ class AgentController extends GetxController { |
|
|
// 是否已加载聊天记录 |
|
|
// 是否已加载聊天记录 |
|
|
final isHistoryLoaded = false.obs; |
|
|
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 |
|
|
@override |
|
|
void onInit() { |
|
|
void onInit() { |
|
|
super.onInit(); |
|
|
super.onInit(); |
|
|
@ -926,12 +936,14 @@ class AgentController extends GetxController { |
|
|
// 恢复音乐播放 |
|
|
// 恢复音乐播放 |
|
|
Future<void> musicResume() async { |
|
|
Future<void> musicResume() async { |
|
|
try { |
|
|
try { |
|
|
Logger.d('AgentController', '恢复音乐播放'); |
|
|
Logger.d('AgentController', '恢复播放音乐'); |
|
|
await _musiceManager.resume(); |
|
|
await _musiceManager.resume(); |
|
|
isPlaying.value = true; |
|
|
isPlaying.value = true; |
|
|
_startProgressTimer(); |
|
|
_startProgressTimer(); |
|
|
|
|
|
Logger.d('AgentController', '音乐恢复播放成功'); |
|
|
} catch (e) { |
|
|
} 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 = ''; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|