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

View File

@ -1,10 +1,13 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:lba/res/colors.dart';
import 'package:lba/utils/sharedPreferencesKey.dart';
import 'package:lba/utils/sharedPreferencesManger.dart';
class ThemeManager extends ChangeNotifier {
class ThemeManager extends ChangeNotifier with WidgetsBindingObserver {
late SharedPreferencesManager _prefs;
bool _isDarkMode = false;
bool _isThemeTransitioning = false;
@ -13,6 +16,13 @@ class ThemeManager extends ChangeNotifier {
ThemeManager() {
_prefs = SharedPreferencesManager();
_loadTheme();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
bool get isDarkMode => _isDarkMode;
@ -160,6 +170,31 @@ class ThemeManager extends ChangeNotifier {
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 {
await _prefs.init();
_hasManualOverride = _prefs.getBool(SharedPreferencesKey.hasManualThemeOverride) ?? false;
@ -176,8 +211,7 @@ class ThemeManager extends ChangeNotifier {
}
bool _getSystemTheme() {
final window = WidgetsBinding.instance.window;
return window.platformBrightness == Brightness.dark;
return WidgetsBinding.instance.platformDispatcher.platformBrightness == Brightness.dark;
}
void _updateSystemUIOverlay() {
@ -228,4 +262,4 @@ class ThemeManager extends ChangeNotifier {
await _prefs.saveBool(SharedPreferencesKey.isDarkMode, _isDarkMode);
notifyListeners();
}
}
}