fix: 修复一些 BUG

chen
Spark 3 months ago
parent 9801f8a7e9
commit 402326cea8

File diff suppressed because one or more lines are too long

@ -1,4 +1,4 @@
#Sat Nov 30 22:59:28 CST 2024
#Sun Dec 01 00:30:23 CST 2024
base.0=E\:\\Desktop\\MTMusic\\android\\app\\build\\intermediates\\dex\\debug\\mergeExtDexDebug\\classes.dex
base.1=E\:\\Desktop\\MTMusic\\android\\app\\build\\intermediates\\dex\\debug\\mergeLibDexDebug\\0\\classes.dex
base.10=E\:\\Desktop\\MTMusic\\android\\app\\build\\intermediates\\dex\\debug\\mergeProjectDexDebug\\12\\classes.dex

@ -0,0 +1,132 @@
import 'package:get/get.dart';
import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';
class SongStatus {
final int id;
RxBool isLiked;
RxBool isCollected;
SongStatus({
required this.id,
required bool liked,
required bool collected,
}) : isLiked = liked.obs,
isCollected = collected.obs;
Map<String, dynamic> toJson() => {
'id': id,
'isLiked': isLiked.value,
'isCollected': isCollected.value,
};
factory SongStatus.fromJson(Map<String, dynamic> json) => SongStatus(
id: json['id'],
liked: json['isLiked'],
collected: json['isCollected'],
);
}
class SongStatusManager {
//
static final SongStatusManager _instance = SongStatusManager._internal();
//
factory SongStatusManager() => _instance;
//
SongStatusManager._internal();
// Map使RxMap使Map
final RxMap<int, SongStatus> _songStatuses = <int, SongStatus>{}.obs;
// SharedPreferences
SharedPreferences? _prefs;
//
Future<void> init() async {
_prefs = await SharedPreferences.getInstance();
await _loadFromStorage();
}
//
Future<void> _loadFromStorage() async {
if (_prefs == null) return;
final String? storedData = _prefs!.getString('song_statuses');
if (storedData != null) {
try {
final List<dynamic> decoded = json.decode(storedData);
final Map<int, SongStatus> loadedStatuses = {};
for (var item in decoded) {
final status = SongStatus.fromJson(item);
loadedStatuses[status.id] = status;
}
_songStatuses.value = loadedStatuses;
} catch (e) {
print('Error loading song statuses: $e');
}
}
}
//
Future<void> _saveToStorage() async {
if (_prefs == null) return;
try {
final List<Map<String, dynamic>> encoded =
_songStatuses.values.map((status) => status.toJson()).toList();
await _prefs!.setString('song_statuses', json.encode(encoded));
} catch (e) {
print('Error saving song statuses: $e');
}
}
//
Future<void> updateSongStatus(int songId, {bool? isLiked, bool? isCollected}) async {
if (_songStatuses.containsKey(songId)) {
final status = _songStatuses[songId]!;
if (isLiked != null) status.isLiked.value = isLiked;
if (isCollected != null) status.isCollected.value = isCollected;
} else {
_songStatuses[songId] = SongStatus(
id: songId,
liked: isLiked ?? false,
collected: isCollected ?? false,
);
}
await _saveToStorage();
}
//
Future<void> updateFromNetworkResponse(int songId, {required bool isLiked, required bool isCollected}) async {
await updateSongStatus(songId, isLiked: isLiked, isCollected: isCollected);
}
//
SongStatus? getSongStatus(int songId) => _songStatuses[songId];
//
bool getLikedStatus(int songId) =>
_songStatuses[songId]?.isLiked.value ?? false;
//
bool getCollectedStatus(int songId) =>
_songStatuses[songId]?.isCollected.value ?? false;
//
Future<void> updateBatchSongStatus(List<SongStatus> statuses) async {
for (var status in statuses) {
_songStatuses[status.id] = status;
}
await _saveToStorage();
}
//
Future<void> clearAllStatuses() async {
_songStatuses.clear();
await _saveToStorage();
}
}

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:music_player_miao/common/song_status_manager.dart';
import 'package:music_player_miao/common_widget/app_data.dart';
import 'package:music_player_miao/view/begin/begin_view.dart';
import 'package:music_player_miao/view/begin/login_v.dart';
@ -13,12 +14,13 @@ import 'common/audio_player_controller.dart';
import 'common/download_count_controller.dart';
import 'common/download_manager.dart';
void main(){
void main() async {
WidgetsFlutterBinding.ensureInitialized();
Get.put(AppData(), permanent: true);
Get.put(DownloadManager(), permanent: true);
Get.put(AudioPlayerController.instance, permanent: true);
Get.put(DownloadCountController, permanent: true);
await SongStatusManager().init();
runApp(const MyApp());
if (Platform.isAndroid) {
SystemUiOverlayStyle systemUiOverlayStyle = SystemUiOverlayStyle(statusBarColor: Colors.transparent);

@ -1,7 +1,10 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:music_player_miao/common_widget/Song_widegt.dart';
import '../../api/api_music_likes.dart';
import '../../common/download_manager.dart';
import '../../common_widget/app_data.dart';
import '../../models/universal_bean.dart';
import '../../view_model/home_view_model.dart';
import '../music_view.dart';
@ -314,35 +317,86 @@ class _MyDownloadViewState extends State<MyDownloadView> {
activeColor: const Color(0xff429482),
)
: null,
title: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
title: Row(
children: [
Text(
song.title,
maxLines: 1,
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.w500,
ClipRRect(
borderRadius: BorderRadius.circular(10),
child: Image.network(
song.artistPic,
width: 50,
height: 50,
fit: BoxFit.cover,
),
),
const SizedBox(width: 10), //
Expanded(
// 使 Expanded
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
song.title,
maxLines: 1,
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.w500,
),
overflow: TextOverflow.ellipsis,
),
Text(
song.artist,
maxLines: 1,
style: TextStyle(
color: Colors.grey[600],
fontSize: 14),
overflow: TextOverflow.ellipsis,
)
],
),
overflow: TextOverflow.ellipsis,
),
Text(
song.artist,
maxLines: 1,
style: TextStyle(
color: Colors.grey[600], fontSize: 14),
overflow: TextOverflow.ellipsis,
)
],
),
trailing: _isSelectMode
? null
: IconButton(
icon: const Icon(Icons.more_vert),
onPressed: () {
_bottomSheet(context, index);
},
: Padding(
padding: const EdgeInsets.only(right: 16),
child: InkWell(
onTap: () async {
setState(() {
song.likes = !song.likes!;
});
UniversalBean response =
await LikesApiMusic().likesMusic(
musicId: song.id,
Authorization:
AppData().currentToken);
if (response.code != 200) {
setState(() {
song.likes = !song.likes!;
});
}
},
child: song.likes!
? Image.asset(
'assets/img/like.png',
width: 24,
height: 24,
)
: ColorFiltered(
colorFilter: ColorFilter.mode(
Colors.grey[700]!,
BlendMode.srcIn,
),
child: Image.asset(
'assets/img/unlike.png',
width: 24,
height: 24,
),
),
),
),
//
onTap: _isSelectMode
@ -368,6 +422,10 @@ class _MyDownloadViewState extends State<MyDownloadView> {
_songs[index].collection =
isCollected;
_songs[index].likes = isLiked;
downloadManager.updateSongInfo(
song.id,
isCollected,
isLiked);
});
},
),

Loading…
Cancel
Save