import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '/modules/agent/widgets/circular_progress_button.dart'; import '../../../routes/app_routes.dart'; import '../../../data/services/qq_music.dart'; import '../../../data/models/song_model.dart'; /// 构建音乐项目 Widget buildQQMusicItem( BuildContext context, List songs, SongModel song, int index) { final qqMusicService = QqMusicService.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: () { try { if (qqMusicService.isPlaying.value) { if (qqMusicService.currentSong.value?.mid == song.mid) { // 当前歌曲正在播放,暂停它 qqMusicService.pauseMusic(); } else { final songMids = songs.map((s) => s.mid).toList(); // 其他歌曲正在播放,播放这首歌 qqMusicService.playSongs( songMids: songMids, index: index, songList: [song], currentSongModel: song, ); } } else { if (qqMusicService.currentSong.value?.mid == song.mid) { // 当前歌曲已暂停,恢复播放 qqMusicService.resumeMusic(); } else { final songMids = songs.map((s) => s.mid).toList(); // 播放新歌曲 qqMusicService.playSongs( songMids: songMids, index: index, songList: [song], currentSongModel: song, ); } } } catch (e) { // 静默处理错误,避免影响用户体验 print('播放控制失败: $e'); } }, onSeek: isThisPlaying ? (seekProgress) { // QQ音乐暂不支持拖拽进度,可以在这里添加相关逻辑 // 或者显示提示信息 print('QQ音乐暂不支持拖拽进度'); } : null, ); }), ], ), ); } /// 构建音乐内容卡片 Widget buildQQMusicContent(BuildContext context, List 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, ), ), ), ), ], ), ], ); }