From 3308db697936dca1d7c98c3410794be2e88ddf26 Mon Sep 17 00:00:00 2001 From: mohamadmahdi jebeli Date: Tue, 23 Sep 2025 07:41:07 +0330 Subject: [PATCH] real time dark mode switching --- lib/main.dart | 6 +++--- lib/utils/theme_manager.dart | 42 ++++++++++++++++++++++++++++++++---- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 98c4a5d..cb31e27 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -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 { ), ); } -} \ No newline at end of file +} + diff --git a/lib/utils/theme_manager.dart b/lib/utils/theme_manager.dart index 41006f9..0fc437e 100644 --- a/lib/utils/theme_manager.dart +++ b/lib/utils/theme_manager.dart @@ -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 _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(); } -} \ No newline at end of file +}