Refactor: Introduce LocaleController and ScaleController, unify text and language settings, and simplify AppSettingsView structure.

This commit is contained in:
2025-09-26 22:55:18 +02:00
parent d5f85c2f41
commit 3e04b9cbe3
5 changed files with 156 additions and 153 deletions

View File

@@ -2,8 +2,6 @@ import 'package:flutter/material.dart';
import 'package:fluttery/fluttery.dart';
import 'package:fluttery/preferences.dart';
/// Controls the current app language (system, de, en, ...).
/// Loads the locale from Preferences or falls back to system default.
class LocaleController extends ChangeNotifier {
final Preferences _prefs;
@@ -11,32 +9,36 @@ class LocaleController extends ChangeNotifier {
static const _key = 'language';
String _current = 'system';
LanguagePref _current = LanguagePref.en; // Default = Englisch
Future<void> init() async {
final saved = await _prefs.getString(_key);
_current = saved ?? 'system';
_current = switch (saved) {
'de' => LanguagePref.de,
'system' => LanguagePref.system,
'en' || _ => LanguagePref.en, // default fallback = en
};
notifyListeners();
}
void setLanguage(String lang) {
_current = lang;
void setLanguage(LanguagePref pref) {
if (_current == pref) return;
_current = pref;
notifyListeners();
_prefs.setString(_key, lang);
_prefs.setString(_key, pref.name); // fire-and-forget
}
/// Returns the actual Locale or null = system.
Locale? get locale {
switch (_current) {
case 'de':
return const Locale('de');
case 'en':
return const Locale('en');
case 'system':
default:
return null;
}
}
LanguagePref get language => _current;
String get language => _current;
Locale? get locale => _current.locale;
}
enum LanguagePref {
system(null), // folgt System
de(Locale('de')), // Deutsch
en(Locale('en')); // Englisch (default)
final Locale? locale;
const LanguagePref(this.locale);
}

View File

@@ -2,8 +2,6 @@ import 'package:flutter/material.dart';
import 'package:fluttery/fluttery.dart';
import 'package:fluttery/preferences.dart';
/// Controls the current text scale (system, small, medium, large).
/// Loads the value from Preferences or falls back to system default.
class ScaleController extends ChangeNotifier {
final Preferences _prefs;
@@ -11,37 +9,40 @@ class ScaleController extends ChangeNotifier {
static const _key = 'textScale';
/// supported sizes
static const Map<String, double> _factors = {
'system': 1.0,
'small': 0.9,
'medium': 1.1,
'large': 1.25,
};
TextScalePref _current = TextScalePref.system;
String _current = 'system';
/// Faktor direkt vom Enum
double get factor => _current.factor;
/// Loads text scale from Preferences.
Future<void> init() async {
final saved = await _prefs.getString(_key);
_current = saved ?? 'system';
if (!_factors.containsKey(_current)) {
_current = 'system';
}
_current = switch (saved) {
'small' => TextScalePref.small,
'medium' => TextScalePref.medium,
'large' => TextScalePref.large,
_ => TextScalePref.system,
};
notifyListeners();
}
/// Set text scale and persist.
void setScale(String scale) {
if (!_factors.containsKey(scale)) return;
_current = scale;
void setScale(TextScalePref pref) {
if (_current == pref) return;
_current = pref;
notifyListeners();
_prefs.setString(_key, scale);
_prefs.setString(_key, pref.name); // fire-and-forget
}
/// get current factor (e.g. for MediaQuery.textScaler)
double get factor => _factors[_current]!;
/// get current string (system/small/medium/large)
String get scale => _current;
TextScalePref get scale => _current;
}
enum TextScalePref {
system(1.0),
small(0.9),
medium(1.1),
large(1.4);
final double factor;
const TextScalePref(this.factor);
}