v2.48 — Shuffle-Modus

## PlayerService
- PlayerService ist jetzt ChangeNotifier (UI hängt per addListener/ListenableBuilder an)
- zufallsmodus Getter + setZufallsmodus(bool)
- Zufallsreihenfolge: alle Queue-Indizes außer dem aktuellen Song, gemischt
- naechstes(): bei Shuffle nächster Song aus Zufallsreihenfolge, ohne Wiederholung bis alle durch
- vorheriges(): geht in der Zufallsreihenfolge zurück
- spiele(): synchronisiert Shuffle-Position (auch bei manueller Auswahl)

## MiniPlayer
- Shuffle-Icon (rot wenn aktiv, Tipp schaltet um)

Keine neuen Packages, flutter analyze 0 Issues, Tests 4/4
This commit is contained in:
Dustin
2026-08-04 16:23:55 +02:00
parent 319b765d08
commit bb8ee56894
2 changed files with 108 additions and 8 deletions
+21 -2
View File
@@ -43,10 +43,17 @@ class _MiniPlayerState extends State<MiniPlayer> {
_songSub = _player.onSongWechsel.listen((_) {
if (mounted) setState(() {});
});
// Shuffle-/Repeat-/Sleep-Zustand live halten
_player.addListener(_onPlayerChanged);
}
void _onPlayerChanged() {
if (mounted) setState(() {});
}
@override
void dispose() {
_player.removeListener(_onPlayerChanged);
_posSub?.cancel();
_stateSub?.cancel();
_songSub?.cancel();
@@ -98,6 +105,8 @@ class _MiniPlayerState extends State<MiniPlayer> {
],
),
),
// Shuffle
_shuffleBtn(),
// Steuerung
_btn(Icons.skip_previous, _player.vorheriges),
_playBtn(),
@@ -123,7 +132,17 @@ class _MiniPlayerState extends State<MiniPlayer> {
);
}
Widget _btn(IconData icon, VoidCallback onTap) {
/// Shuffle-Icon — rot wenn aktiv
Widget _shuffleBtn() {
final aktiv = _player.zufallsmodus;
return _btn(
Icons.shuffle,
() => _player.setZufallsmodus(!aktiv),
farbe: aktiv ? MeloTheme.rot : Colors.white,
);
}
Widget _btn(IconData icon, VoidCallback onTap, {Color farbe = Colors.white}) {
return Material(
color: Colors.transparent,
child: InkWell(
@@ -132,7 +151,7 @@ class _MiniPlayerState extends State<MiniPlayer> {
child: Container(
width: 32, height: 32,
alignment: Alignment.center,
child: Icon(icon, size: 18, color: Colors.white),
child: Icon(icon, size: 18, color: farbe),
),
),
);