You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

279 lines
9.8 KiB

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:voitrans/modules/agent/widgets/circular_progress_button.dart';
import '../../../routes/app_routes.dart';
import '../../../data/services/qq_musoc.dart';
import '../../../data/models/song_model.dart';
/// 构建音乐项目
Widget buildQQMusicItem(
BuildContext context, List<SongModel> songs, SongModel song, int index) {
final qqMusicService = QqMusocService.to; // 使用QQ音乐全局服务
final isDarkMode = Theme.of(context).brightness == Brightness.dark;
return Container(
padding: EdgeInsets.all(14.w),
decoration: BoxDecoration(
color: isDarkMode ? const Color(0xFF1E1E1E) : Colors.white,
borderRadius: BorderRadius.circular(12.r),
boxShadow: [
BoxShadow(
color: Colors.black.withValues(alpha: isDarkMode ? 0.2 : 0.03),
blurRadius: 3,
spreadRadius: 1,
offset: const Offset(0, 1),
),
],
),
child: Row(
children: [
Container(
width: 50.w,
height: 50.h,
decoration: BoxDecoration(
color: isDarkMode ? Colors.grey[800] : Colors.grey[100],
borderRadius: BorderRadius.circular(8.r),
),
child: Stack(
children: [
// 主图片
Container(
width: 50.w,
height: 50.h,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.r),
image: song.albumPic!.isNotEmpty
? DecorationImage(
image: NetworkImage(song.albumPic!),
fit: BoxFit.cover,
)
: null,
),
child: song.albumPic!.isEmpty
? Icon(
Icons.music_note,
size: 18.sp,
color: Theme.of(context).primaryColor,
)
: null,
),
// 右下角音乐图标
if (song.albumPic!.isNotEmpty)
Positioned(
right: 0.w,
bottom: 0.w,
child: Container(
width: 12.w,
height: 12.w,
child: Image.asset(
'assets/images/qqmusic.png',
fit: BoxFit.contain,
),
),
),
],
),
),
SizedBox(width: 12.w),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
song.name,
style: TextStyle(
fontSize: 13.sp,
fontWeight: FontWeight.w500,
color: isDarkMode
? Colors.white.withValues(alpha: 0.9)
: Colors.grey[800],
),
overflow: TextOverflow.ellipsis,
),
SizedBox(height: 2.h),
Text(
song.artist,
style: TextStyle(
fontSize: 12.sp,
color: isDarkMode ? Colors.grey[400] : Colors.grey[600],
),
overflow: TextOverflow.ellipsis,
),
],
),
),
Obx(() {
// 使用QQ音乐服务的全局状态
final isThisPlaying = qqMusicService.isPlaying.value &&
qqMusicService.currentSong.value?.mid == song.mid;
// 计算播放进度
final currentProgress =
isThisPlaying && qqMusicService.totalDuration.value > 0
? qqMusicService.currentPosition.value /
qqMusicService.totalDuration.value
: 0.0;
return CircularProgressButton(
isPlaying: isThisPlaying,
progress: currentProgress,
primaryColor: Theme.of(context).primaryColor,
backgroundColor: Colors.grey,
size: 36.0,
strokeWidth: 2.0,
onPlayPause: () async {
try {
if (qqMusicService.isPlaying.value) {
if (qqMusicService.currentSong.value?.mid == song.mid) {
// 当前歌曲正在播放,暂停它
await qqMusicService.pauseMusic();
} else {
final songMids = songs.map((s) => s.mid).toList();
// 其他歌曲正在播放,播放这首歌
final result = await 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();
} else {
final songMids = songs.map((s) => s.mid).toList();
// 播放新歌曲
final result = await 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) {
// 静默处理错误,避免影响用户体验
print('播放控制失败: $e');
}
},
onSeek: isThisPlaying
? (seekProgress) {
// QQ音乐暂不支持拖拽进度,可以在这里添加相关逻辑
// 或者显示提示信息
print('QQ音乐暂不支持拖拽进度');
}
: null,
);
}),
],
),
);
}
/// 构建音乐内容卡片
Widget buildQQMusicContent(BuildContext context, List<SongModel> songs) {
final isDarkMode = Theme.of(context).brightness == Brightness.dark;
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'recommendedMusic'.tr, //以下是一些推荐的音乐:
style: TextStyle(
color:
isDarkMode ? Colors.white.withValues(alpha: 0.9) : Colors.black87,
fontSize: 14,
height: 1.4,
fontWeight: FontWeight.w400,
),
),
const SizedBox(height: 12),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Container(
width: 18.w,
height: 18.w,
child: Image.asset(
'assets/images/qqmusic.png',
fit: BoxFit.contain,
),
),
const SizedBox(width: 6),
Text(
'playList'.tr, //播放列表
style: TextStyle(
fontSize: 13,
fontWeight: FontWeight.w600,
color: Theme.of(context).brightness == Brightness.dark
? Colors.grey[300]
: Colors.grey[700],
),
),
],
),
const SizedBox(height: 10),
// 动态生成音乐条目
...songs.asMap().entries.take(4).map((entry) {
final index = entry.key;
final item = entry.value;
return Column(
children: [
buildQQMusicItem(context, songs, item, index),
if (index != songs.length - 1)
Divider(
height: 1,
thickness: 1,
color: Theme.of(context).brightness == Brightness.dark
? Colors.grey[800]
: Colors.grey[100],
),
],
);
}).toList(),
const SizedBox(height: 8),
Center(
child: TextButton(
onPressed: () {
// 跳转到完整歌单页面,传递完整的歌单数据
Get.toNamed(Routes.qqmusic, arguments: {"playlist": songs});
},
style: TextButton.styleFrom(
minimumSize: Size.zero,
padding:
const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
),
child: Text(
'moreMusic'.tr, //更多音乐,
style: TextStyle(
fontSize: 12,
color: Theme.of(context).primaryColor,
fontWeight: FontWeight.w500,
),
),
),
),
],
),
],
);
}