Refactor: Move theme management to ThemeController, add LocaleController and ScaleController for improved UI customization, and update related imports.

This commit is contained in:
2025-09-26 20:27:45 +02:00
parent ece3c333eb
commit d5f85c2f41
6 changed files with 94 additions and 4 deletions

View File

@@ -0,0 +1,42 @@
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;
LocaleController() : _prefs = App.service<Preferences>();
static const _key = 'language';
String _current = 'system';
Future<void> init() async {
final saved = await _prefs.getString(_key);
_current = saved ?? 'system';
notifyListeners();
}
void setLanguage(String lang) {
_current = lang;
notifyListeners();
_prefs.setString(_key, lang);
}
/// 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;
}
}
String get language => _current;
}

View File

@@ -0,0 +1,47 @@
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;
ScaleController() : _prefs = App.service<Preferences>();
static const _key = 'textScale';
/// supported sizes
static const Map<String, double> _factors = {
'system': 1.0,
'small': 0.9,
'medium': 1.1,
'large': 1.25,
};
String _current = 'system';
/// Loads text scale from Preferences.
Future<void> init() async {
final saved = await _prefs.getString(_key);
_current = saved ?? 'system';
if (!_factors.containsKey(_current)) {
_current = 'system';
}
notifyListeners();
}
/// Set text scale and persist.
void setScale(String scale) {
if (!_factors.containsKey(scale)) return;
_current = scale;
notifyListeners();
_prefs.setString(_key, scale);
}
/// get current factor (e.g. for MediaQuery.textScaler)
double get factor => _factors[_current]!;
/// get current string (system/small/medium/large)
String get scale => _current;
}

View File

@@ -0,0 +1,48 @@
import 'package:flutter/material.dart';
import 'package:fluttery/fluttery.dart';
import 'package:fluttery/preferences.dart';
/// Controls the current theme of the application.
/// Loads the theme from Preferences or falls back to system default.
class ThemeController extends ChangeNotifier {
final Preferences _prefs;
/// themeMode (system, dark or white)
ThemeMode _themeMode = ThemeMode.system;
/// Constructor
ThemeController() : _prefs = App.service<Preferences>();
/// Loads theme from Preferences (or defaults to system).
Future<void> init() async {
final saved = await _prefs.getString('theme');
if (saved == null) {
_themeMode = ThemeMode.system;
} else {
_themeMode = _fromString(saved);
}
notifyListeners();
}
/// Sets theme and persists it in Preferences.
void setTheme(ThemeMode mode) {
_themeMode = mode;
notifyListeners();
_prefs.setString('theme', mode.name);
}
ThemeMode _fromString(String value) {
switch (value) {
case 'light':
return ThemeMode.light;
case 'dark':
return ThemeMode.dark;
case 'system':
default:
return ThemeMode.system;
}
}
/// get current ThemeMode
ThemeMode get themeMode => _themeMode;
}