v2.51.1 — Technik ausgelagert: Erweitert-Sektion (Logs, Diagnose, Entwickler, Scanner)

## Erweitert
- Neuer ErweitertScreen (lib/screens/erweitert_screen.dart): Logs, Diagnosedaten-Toggle, Entwickler, Musik scannen
- Neuer LogViewerScreen: In-Memory-Logbuch mit Kategorie-Filter (MeloLogger bekommt Anzeige-Puffer, der beim Senden nicht geleert wird)
- Neuer EntwicklerScreen: Version, Session-ID, DB-Songzahl, Server-URLs, Test-Log senden
- Einstellungen-Screen: 'Erweitert'-Sektion eingebaut, Diagnose-Toggle dorthin verschoben, Version auf 2.51

## Einstellungen
- 'Server verbinden' → 'Musikserver' umbenannt
- Abmelden/Info/Cloud Sync unverändert
This commit is contained in:
Dustin
2026-08-05 07:54:22 +02:00
parent 0439ce3ed2
commit f886b0a42e
3 changed files with 609 additions and 42 deletions
+46 -42
View File
@@ -1,9 +1,9 @@
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../config/app_config.dart';
import '../utils/farb_theme.dart';
import 'cloud_screen.dart';
import 'recap_screen.dart';
import 'erweitert_screen.dart';
import '../services/cloud_service.dart';
/// Vollwertiger Einstellungen-Screen kein Popup mehr
@@ -15,19 +15,6 @@ class SettingsScreen extends StatefulWidget {
}
class _SettingsScreenState extends State<SettingsScreen> {
bool _diagnose = AppConfig.sendeDiagnosedaten;
@override
void initState() {
super.initState();
_ladeDiagnose();
}
Future<void> _ladeDiagnose() async {
final p = await SharedPreferences.getInstance();
if (mounted) setState(() => _diagnose = p.getBool('diagnose_daten') ?? AppConfig.sendeDiagnosedaten);
}
@override
Widget build(BuildContext context) {
return Scaffold(
@@ -69,8 +56,8 @@ class _SettingsScreenState extends State<SettingsScreen> {
),
_einstellungsKachel(
icon: Icons.dns_outlined,
titel: 'Server verbinden',
untertitel: 'Navidrome Musik-Server',
titel: 'Musikserver',
untertitel: 'Navidrome Musik-Server verbinden',
onTap: () {
// Signal zum Öffnen des Server-Browsers
Navigator.pop(context, 'server');
@@ -92,31 +79,48 @@ class _SettingsScreenState extends State<SettingsScreen> {
},
),
const SizedBox(height: 8),
Container(
decoration: BoxDecoration(
color: MeloTheme.dunkel1,
borderRadius: BorderRadius.circular(14),
border: Border.all(color: MeloTheme.dunkel2),
),
child: SwitchListTile(
title: const Text(
'Diagnosedaten senden',
style: TextStyle(color: Colors.white, fontSize: 14),
),
subtitle: const Text(
'Absturz-Logs & anonyme Nutzungsdaten',
style: TextStyle(color: MeloTheme.textSekundaer, fontSize: 12),
),
value: _diagnose,
activeThumbColor: MeloTheme.rot,
onChanged: (v) async {
setState(() => _diagnose = v);
AppConfig.sendeDiagnosedaten = v;
final p = await SharedPreferences.getInstance();
p.setBool('diagnose_daten', v);
},
secondary: const Icon(Icons.bug_report_outlined, color: MeloTheme.rot, size: 22),
),
// ─── Sektion: Erweitert (Technik) ───
_sektionHeader('Erweitert'),
_einstellungsKachel(
icon: Icons.handyman_outlined,
titel: 'Erweitert',
untertitel: 'Logs, Diagnose, Entwickler & Scanner',
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => ErweitertScreen(
onScan: () {
// Zurück zu MeloHome, das den Scanner startet
Navigator.pop(context, 'scanner');
},
),
),
);
},
),
_einstellungsKachel(
icon: Icons.article_outlined,
titel: 'Logs',
untertitel: 'App-Logbuch im Speicher ansehen',
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (_) => const LogViewerScreen()),
);
},
),
_einstellungsKachel(
icon: Icons.bug_report_outlined,
titel: 'Entwickler',
untertitel: 'Version, URLs & technische Details',
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (_) => const EntwicklerScreen()),
);
},
),
const SizedBox(height: 8),
@@ -130,7 +134,7 @@ class _SettingsScreenState extends State<SettingsScreen> {
),
child: Column(
children: [
_infoZeile('Version', '2.31'),
_infoZeile('Version', '2.51'),
const Divider(color: MeloTheme.dunkel2, height: 1),
_infoZeile('Theme', 'Schwarz + Rot'),
const Divider(color: MeloTheme.dunkel2, height: 1),