Browse Source

上传qq音乐代码优化

newdev_shunjiawei
liwei1dao 1 year ago
parent
commit
7c394dd8fa
  1. 36
      lib/data/services/qq_musoc.dart
  2. 2
      lib/modules/agent/controllers/agent_controller.dart
  3. 19
      lib/modules/agent/views/message_bubble.dart
  4. 67
      lib/modules/agent/views/qqmusic_card.dart
  5. 239
      lib/modules/qqmusic/controllers/qqmusic_playlist_controller.dart
  6. 61
      lib/modules/qqmusic/views/qqmusic_playlist_view.dart

36
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<SongModel>();
final playlist = <SongModel>[].obs;
final currentIndex = 0.obs;
// final playlist = <SongModel>[].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<Map<String, dynamic>> 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();
}

2
lib/modules/agent/controllers/agent_controller.dart

@ -159,7 +159,7 @@ class AgentController extends GetxController {
startVoiceInput(); //开启语音输入
_qqmusicManager.syncCurrentPlayInfo();
// _qqmusicManager.syncCurrentPlayInfo();
}
// 初始化音乐播放状态

19
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<AgentController> {
if (data != null && data is List) {
//qq音乐
final rawList = data as List? ?? [];
final playlist =
rawList.map((e) => Map<String, dynamic>.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<SongModel>()
.toList();
//音乐播放列表
return buildQQMusicContent(context, playlist);
return buildQQMusicContent(context, songList);
}
} else if (meta!.keys.contains('maps_weather')) {
final maps_weather = meta!['maps_weather'] as Map<String, dynamic>;

67
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<SongModel> 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<Map<String, dynamic>> playlist) {
Widget buildQQMusicContent(BuildContext context, List<SongModel> 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,

239
lib/modules/qqmusic/controllers/qqmusic_playlist_controller.dart

@ -12,112 +12,123 @@ class QQMusicPlaylistController extends GetxController {
final isLoggedIn = false.obs;
final userInfo = Rxn<Map<String, dynamic>>();
// 直接使用全局服务的状态 - 修复返回类型
RxBool get isPlaying => _qqMusicService.isPlaying;
// 界面维护的播放列表状态
RxList<SongModel> playlist = <SongModel>[].obs;
RxInt currentIndex = 0.obs;
// 界面显示的当前歌曲(可能与实际播放的不同)
Rxn<SongModel> displayCurrentSong = Rxn<SongModel>();
// 界面播放状态(当前播放歌曲不在列表中时为未播放状态)
RxBool displayIsPlaying = false.obs;
// 从全局服务获取实际播放状态(仅用于同步)
RxBool get actualIsPlaying => _qqMusicService.isPlaying;
RxInt get currentPosition => _qqMusicService.currentPosition;
RxInt get totalDuration => _qqMusicService.totalDuration;
Rxn<SongModel> get currentSong => _qqMusicService.currentSong;
RxList<SongModel> get playlist => _qqMusicService.playlist;
RxInt get currentIndex => _qqMusicService.currentIndex;
Rxn<SongModel> 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<dynamic> 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<SongModel>()
.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<SongModel> 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<SongModel>()
// .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<void> _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<void> playSong(SongModel song, {List<SongModel>? songList}) async {
try {
// 如果没有传入歌曲列表,使用当前播放列表
// 使用传入的歌曲列表或当前播放列表
final List<SongModel> 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<void> playPlaylistSong(int index) async {
if (index >= 0 && index < playlist.length) {
await playSong(playlist[index]);
}
}
/// 暂停/继续播放
Future<void> 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<void> nextSong() async {
await _qqMusicService.skipToNext();
if (playlist.isNotEmpty) {
final nextIndex = (currentIndex.value + 1) % playlist.length;
await playPlaylistSong(nextIndex);
}
}
/// 上一首
/// 上一首(列表内)
Future<void> previousSong() async {
await _qqMusicService.skipToPrevious();
if (playlist.isNotEmpty) {
final prevIndex =
currentIndex.value > 0 ? currentIndex.value - 1 : playlist.length - 1;
await playPlaylistSong(prevIndex);
}
}
/// 停止播放
Future<void> 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<SongModel> newPlaylist) {
playlist.assignAll(newPlaylist);
_syncDisplayStateWithActualPlayback();
Logger.d('QQMusicPlaylist', '播放列表已更新,歌曲数量: ${newPlaylist.length}');
}
}

61
lib/modules/qqmusic/views/qqmusic_playlist_view.dart

@ -26,7 +26,7 @@ class QqmusicPlaylistView extends GetView<QQMusicPlaylistController> {
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<QQMusicPlaylistController> {
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<QQMusicPlaylistController> {
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<QQMusicPlaylistController> {
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<QQMusicPlaylistController> {
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<QQMusicPlaylistController> {
Logger.e('MusicPlaylistView', '播放音乐时发生错误: $e');
}
},
onSeek: isThisPlaying ? (seekProgress) {} : null,
onSeek: isThactualIsPlaying ? (seekProgress) {} : null,
);
}),
],
@ -431,11 +432,11 @@ class QqmusicPlaylistView extends GetView<QQMusicPlaylistController> {
// 构建迷你播放器 - 参考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<QQMusicPlaylistController> {
),
IconButton(
icon: Icon(
controller.isPlaying.value
controller.actualIsPlaying.value
? Icons.pause
: Icons.play_arrow,
),
@ -569,7 +570,9 @@ class QqmusicPlaylistView extends GetView<QQMusicPlaylistController> {
},
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<QQMusicPlaylistController> {
}
// 播放/暂停切换
Future<void> _togglePlayPause(AgentController controller) async {
if (controller.isPlaying.value) {
await controller.musicPause();
} else {
await controller.musicResume();
}
}
// Future<void> _togglePlayPause() async {
// if (controller.actualIsPlaying.value) {
// await controller.musicPause();
// } else {
// await controller.musicResume();
// }
// }
// 播放上一曲
Future<void> _playPrevious(

Loading…
Cancel
Save