initial commit
This commit is contained in:
100
lib/theme/theme_manager.dart
Normal file
100
lib/theme/theme_manager.dart
Normal file
@@ -0,0 +1,100 @@
|
||||
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<ThemeManager>().theme : context.read<ThemeManager>().theme;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class ThemeModeUtils {
|
||||
|
||||
ThemeModeUtils._();
|
||||
|
||||
static ThemeMode fromString( String themeModeString ){
|
||||
Map<String, ThemeMode> data = {
|
||||
'light': ThemeMode.light,
|
||||
'dark': ThemeMode.dark,
|
||||
'system': ThemeMode.system
|
||||
};
|
||||
return data[themeModeString]!;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension ThemeModeExtention on ThemeMode {
|
||||
|
||||
String toRawString(){
|
||||
return toString().split('.').last;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user