import 'dart:ui'; import 'package:base_project/storage/storage_keys.dart'; import 'package:base_project/storage/storage_service.dart'; import 'package:base_project/theme/theme_data.dart'; import 'package:base_project/theme/theme_schema.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; class ThemeManager extends ChangeNotifier { late ThemeSchema theme; late ThemeMode themeMode; PlatformDispatcher dispatcher = SchedulerBinding.instance.platformDispatcher; ThemeManager(){ init(); } void init(){ themeMode = ThemeModeUtils.fromString( StorageService.getValue( StorageServiceValueType.string, StorageKeys.theme) ?? ThemeMode.system.toRawString() ); dispatcher.onPlatformBrightnessChanged = _onBrightnessChanged; _setCurrentTheme(); } void changeThemeMode( ThemeMode themeMode ){ StorageService.setValue(StorageServiceValueType.string, StorageKeys.theme, themeMode.toRawString()); this.themeMode = themeMode; _setCurrentTheme(); notifyListeners(); } void _onBrightnessChanged (){ if( themeMode != ThemeMode.system ) return; if( dispatcher.platformBrightness == Brightness.light ){ theme = LightTheme(); }else{ theme = DarkTheme(); } notifyListeners(); } void _setCurrentTheme(){ if( themeMode == ThemeMode.system ){ theme = dispatcher.platformBrightness == Brightness.light ? LightTheme() : DarkTheme(); }else { theme = themeMode == ThemeMode.light ? LightTheme() : DarkTheme(); } SystemChrome.setSystemUIOverlayStyle( SystemUiOverlayStyle( statusBarColor: Colors.transparent, statusBarIconBrightness: theme.brightness == Brightness.light ? Brightness.dark : Brightness.light ) ); } static ThemeSchema getTheme( BuildContext context, { bool listen = true } ){ return listen ? context.watch().theme : context.read().theme; } } class ThemeModeUtils { ThemeModeUtils._(); static ThemeMode fromString( String themeModeString ){ Map data = { 'light': ThemeMode.light, 'dark': ThemeMode.dark, 'system': ThemeMode.system }; return data[themeModeString]!; } } extension ThemeModeExtention on ThemeMode { String toRawString(){ return toString().split('.').last; } }