v2.48.3 — Sleep-Timer

## PlayerService
- setSleepTimer(Duration): nach Ablauf wird pausiert (Timer aus dart:async)
- cancelSleepTimer(), sleepTimerAktiv, sleepRestzeit (live berechnet)
- Timer wird in dispose() aufgeräumt

## WarteschlangeSheet
- Schlaf-Timer-Zeile: Optionen Aus/15/30/45/60 Min als Chips
- Aktiver Timer zeigt Restzeit (⏱ MM:SS), Aktualisierung jede Sekunde
- 'Aus'-Chip rot wenn Timer inaktiv, sonst gewählte Dauer aktiv markiert

Keine neuen Packages, flutter analyze 0 Issues, Tests 4/4
This commit is contained in:
Dustin
2026-08-04 16:25:30 +02:00
parent 5edfae01e5
commit 34ac791fa6
2 changed files with 126 additions and 0 deletions
+38
View File
@@ -33,6 +33,10 @@ class PlayerService extends ChangeNotifier {
// ─── Wiederholmodus (Repeat) ───
Wiederholmodus _wiederholmodus = Wiederholmodus.aus;
// ─── Sleep-Timer ───
Timer? _sleepTimer;
DateTime? _sleepEnde;
AudioPlayer get _p {
if (_player == null) {
_player = AudioPlayer();
@@ -301,9 +305,43 @@ class PlayerService extends ChangeNotifier {
notifyListeners();
}
// ─── Sleep-Timer ───
bool get sleepTimerAktiv => _sleepTimer != null;
/// Verbleibende Zeit bis zum automatischen Pausieren (null wenn inaktiv).
Duration? get sleepRestzeit {
final ende = _sleepEnde;
if (ende == null) return null;
final rest = ende.difference(DateTime.now());
return rest.isNegative ? Duration.zero : rest;
}
/// Startet den Sleep-Timer — nach [dauer] wird die Wiedergabe pausiert.
void setSleepTimer(Duration dauer) {
cancelSleepTimer();
_sleepEnde = DateTime.now().add(dauer);
_sleepTimer = Timer(dauer, () {
_sleepTimer = null;
_sleepEnde = null;
pause();
notifyListeners();
});
notifyListeners();
}
/// Bricht den Sleep-Timer ab.
void cancelSleepTimer() {
_sleepTimer?.cancel();
_sleepTimer = null;
_sleepEnde = null;
notifyListeners();
}
@override
void dispose() {
_autoNextSub?.cancel();
_sleepTimer?.cancel();
_player?.dispose();
_player = null;
_songWechsel.close();