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