real time dark mode switching
This commit is contained in:
parent
9a4c51dafb
commit
3308db6979
|
|
@ -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(
|
||||
|
|
@ -47,3 +46,4 @@ class MyApp extends StatelessWidget {
|
|||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
Loading…
Reference in New Issue