Refactor: Introduce LocaleController and ScaleController, unify text and language settings, and simplify AppSettingsView structure.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user