Fix: Review-Findings korrigiert (Tag-Leiste, Profil, Singleton u.a.)

CRIT:
- Tag-Leiste: Toggle-Kopf 'Tags & Filter' eingebaut (war unerreichbar) + TagStats
- Profil: Cloud-Count vor Dialog aufloesen (kein 'Instance of Future' mehr)
HIGH:
- CloudEinstellungen: toten Sync-Timer entfernt (echter Timer im ViewModel)
- StatistikCard + RecentWidget jetzt eingebaut (gesamtMB/gesamtMin endlich genutzt)
- CloudService als Singleton (konsistenter Token-Zustand in allen Services)
MED/LOW:
- Playlist-Erkennung nur noch via list= Parameter
- Player: fehlende Quelle wird geloggt statt still
- song_tile: null-ID-Guard vor Tag-Dialog
- Scanner-Log mit Exception-Objekt
- FavoritenService: anzahlFavoriten() fuer StatistikCard
This commit is contained in:
Hermes (Server)
2026-07-31 15:42:54 +02:00
parent b3aedc53f9
commit 8b6a04ead8
18 changed files with 767 additions and 503 deletions
+5 -25
View File
@@ -1,4 +1,3 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../services/cloud_service.dart';
@@ -16,7 +15,6 @@ class CloudEinstellungen extends StatefulWidget {
class _CloudEinstellungenState extends State<CloudEinstellungen> {
bool _autoSync = true;
int _syncIntervall = 6; // Stunden
Timer? _syncTimer;
@override
void initState() {
@@ -24,12 +22,6 @@ class _CloudEinstellungenState extends State<CloudEinstellungen> {
_ladeSettings();
}
@override
void dispose() {
_syncTimer?.cancel();
super.dispose();
}
Future<void> _ladeSettings() async {
final p = await SharedPreferences.getInstance();
if (mounted) {
@@ -39,19 +31,9 @@ class _CloudEinstellungenState extends State<CloudEinstellungen> {
});
}
}
void _starteAutoSync() {
_syncTimer?.cancel();
if (!_autoSync || _syncIntervall == 0) return;
_syncTimer = Timer.periodic(
Duration(hours: _syncIntervall),
(_) => _triggerSync(),
);
}
void _triggerSync() {
// Wird vom CloudService in cloud_screen.dart erledigt
}
// Hinweis: Der echte Auto-Sync-Timer läuft im MeloHomeViewModel
// (_starteCloudSyncScheduler). Dieser Dialog speichert nur die Einstellungen;
// die Änderungen greifen beim nächsten App-Start bzw. über "Jetzt synchronisieren".
@override
Widget build(BuildContext context) {
@@ -76,8 +58,7 @@ class _CloudEinstellungenState extends State<CloudEinstellungen> {
onChanged: (v) async {
setState(() => _autoSync = v);
final p = await SharedPreferences.getInstance();
p.setBool('cloud_auto', v);
_starteAutoSync();
await p.setBool('cloud_auto', v);
},
),
const Divider(color: MeloTheme.dunkel2),
@@ -95,8 +76,7 @@ class _CloudEinstellungenState extends State<CloudEinstellungen> {
if (v == null) return;
setState(() => _syncIntervall = v);
final p = await SharedPreferences.getInstance();
p.setInt('cloud_interval', v);
_starteAutoSync();
await p.setInt('cloud_interval', v);
},
);
}),