real time dark mode switching

This commit is contained in:
mohamadmahdi jebeli 2025-09-23 07:41:07 +03:30
parent 9a4c51dafb
commit 3308db6979
2 changed files with 41 additions and 7 deletions

View File

@ -33,8 +33,7 @@ class MyApp extends StatelessWidget {
title: 'LBA', title: 'LBA',
theme: themeManager.lightTheme, theme: themeManager.lightTheme,
darkTheme: themeManager.darkTheme, darkTheme: themeManager.darkTheme,
themeMode: themeMode: themeManager.getThemeMode(),
themeManager.isDarkMode ? ThemeMode.dark : ThemeMode.light,
themeAnimationDuration: const Duration(milliseconds: 300), themeAnimationDuration: const Duration(milliseconds: 300),
themeAnimationCurve: Curves.easeInOutCubic, themeAnimationCurve: Curves.easeInOutCubic,
home: SplashScreen( home: SplashScreen(
@ -46,4 +45,5 @@ class MyApp extends StatelessWidget {
), ),
); );
} }
} }

View File

@ -1,10 +1,13 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:lba/res/colors.dart'; import 'package:lba/res/colors.dart';
import 'package:lba/utils/sharedPreferencesKey.dart'; import 'package:lba/utils/sharedPreferencesKey.dart';
import 'package:lba/utils/sharedPreferencesManger.dart'; import 'package:lba/utils/sharedPreferencesManger.dart';
class ThemeManager extends ChangeNotifier { class ThemeManager extends ChangeNotifier with WidgetsBindingObserver {
late SharedPreferencesManager _prefs; late SharedPreferencesManager _prefs;
bool _isDarkMode = false; bool _isDarkMode = false;
bool _isThemeTransitioning = false; bool _isThemeTransitioning = false;
@ -13,6 +16,13 @@ class ThemeManager extends ChangeNotifier {
ThemeManager() { ThemeManager() {
_prefs = SharedPreferencesManager(); _prefs = SharedPreferencesManager();
_loadTheme(); _loadTheme();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
} }
bool get isDarkMode => _isDarkMode; bool get isDarkMode => _isDarkMode;
@ -160,6 +170,31 @@ class ThemeManager extends ChangeNotifier {
ThemeData get currentTheme => _isDarkMode ? darkTheme : lightTheme; ThemeData get currentTheme => _isDarkMode ? darkTheme : lightTheme;
/// Returns the appropriate ThemeMode based on user preferences
ThemeMode getThemeMode() {
if (_hasManualOverride) {
return _isDarkMode ? ThemeMode.dark : ThemeMode.light;
} else {
return ThemeMode.system;
}
}
@override
void didChangePlatformBrightness() {
super.didChangePlatformBrightness();
// Only respond to system theme changes if user hasn't manually overridden
if (!_hasManualOverride) {
bool systemIsDark = _getSystemTheme();
if (_isDarkMode != systemIsDark) {
_isDarkMode = systemIsDark;
AppColors.setDarkMode(_isDarkMode);
_updateSystemUIOverlay();
notifyListeners();
}
}
}
Future<void> _loadTheme() async { Future<void> _loadTheme() async {
await _prefs.init(); await _prefs.init();
_hasManualOverride = _prefs.getBool(SharedPreferencesKey.hasManualThemeOverride) ?? false; _hasManualOverride = _prefs.getBool(SharedPreferencesKey.hasManualThemeOverride) ?? false;
@ -176,8 +211,7 @@ class ThemeManager extends ChangeNotifier {
} }
bool _getSystemTheme() { bool _getSystemTheme() {
final window = WidgetsBinding.instance.window; return WidgetsBinding.instance.platformDispatcher.platformBrightness == Brightness.dark;
return window.platformBrightness == Brightness.dark;
} }
void _updateSystemUIOverlay() { void _updateSystemUIOverlay() {
@ -228,4 +262,4 @@ class ThemeManager extends ChangeNotifier {
await _prefs.saveBool(SharedPreferencesKey.isDarkMode, _isDarkMode); await _prefs.saveBool(SharedPreferencesKey.isDarkMode, _isDarkMode);
notifyListeners(); notifyListeners();
} }
} }