feat(settings): Cache-Status UI + Clear-Button (Phase 2)
- Neuer 'Cache-Speicher' ListTile in Musikserver-Sektion
- Zeigt Cache-Größe in MB/KB/B
- Clear-Button: Löscht alle gecachten Lieder
- _formatBytes() für Größen-Anzeige
- _clearCache() mit SnackBar-Feedback
Nutzer kann jetzt Cache-Status sehen + leeren!
Tests: 70/70 ✅
This commit is contained in:
@@ -3,6 +3,7 @@ import 'package:provider/provider.dart';
|
|||||||
|
|
||||||
import '../library/database.dart';
|
import '../library/database.dart';
|
||||||
import '../library/permissions.dart';
|
import '../library/permissions.dart';
|
||||||
|
import '../services/cache_manager.dart';
|
||||||
import '../services/navidrome_service.dart';
|
import '../services/navidrome_service.dart';
|
||||||
import '../services/offline_mode.dart';
|
import '../services/offline_mode.dart';
|
||||||
import 'library_stats.dart';
|
import 'library_stats.dart';
|
||||||
@@ -17,11 +18,19 @@ class SettingsScreen extends StatefulWidget {
|
|||||||
|
|
||||||
class _SettingsScreenState extends State<SettingsScreen> {
|
class _SettingsScreenState extends State<SettingsScreen> {
|
||||||
late final NavidromeService _navidrome = NavidromeService();
|
late final NavidromeService _navidrome = NavidromeService();
|
||||||
|
late final CacheManager _cache = CacheManager();
|
||||||
|
int _cacheSize = 0;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
_navidrome.ladeGespeicherteZugangsdaten();
|
_navidrome.ladeGespeicherteZugangsdaten();
|
||||||
|
_cache.init().then((_) => _updateCacheSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _updateCacheSize() async {
|
||||||
|
final size = await _cache.getCacheSize();
|
||||||
|
if (mounted) setState(() => _cacheSize = size);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -82,6 +91,18 @@ class _SettingsScreenState extends State<SettingsScreen> {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
ListTile(
|
||||||
|
leading: const Icon(Icons.storage),
|
||||||
|
title: const Text('🗄️ Cache-Speicher'),
|
||||||
|
subtitle: Text(_formatBytes(_cacheSize)),
|
||||||
|
trailing: _cacheSize > 0
|
||||||
|
? IconButton(
|
||||||
|
tooltip: 'Cache löschen',
|
||||||
|
icon: const Icon(Icons.delete),
|
||||||
|
onPressed: () => _clearCache(),
|
||||||
|
)
|
||||||
|
: null,
|
||||||
|
),
|
||||||
const Divider(height: 1),
|
const Divider(height: 1),
|
||||||
const _SectionLabel('Berechtigungen'),
|
const _SectionLabel('Berechtigungen'),
|
||||||
ListTile(
|
ListTile(
|
||||||
@@ -210,6 +231,22 @@ class _SettingsScreenState extends State<SettingsScreen> {
|
|||||||
await _navidrome.loescheZugangsdaten();
|
await _navidrome.loescheZugangsdaten();
|
||||||
if (mounted) setState(() {});
|
if (mounted) setState(() {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> _clearCache() async {
|
||||||
|
await _cache.clearCache();
|
||||||
|
if (mounted) {
|
||||||
|
setState(() => _cacheSize = 0);
|
||||||
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
|
const SnackBar(content: Text('Cache gelöscht')),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String _formatBytes(int bytes) {
|
||||||
|
if (bytes < 1024) return '$bytes B';
|
||||||
|
if (bytes < 1024 * 1024) return '${(bytes / 1024).toStringAsFixed(1)} KB';
|
||||||
|
return '${(bytes / (1024 * 1024)).toStringAsFixed(1)} MB';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Kleine graue Überschrift über einer Einstellungs-Gruppe.
|
/// Kleine graue Überschrift über einer Einstellungs-Gruppe.
|
||||||
|
|||||||
Reference in New Issue
Block a user