100 lines
2.4 KiB
Dart
100 lines
2.4 KiB
Dart
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;
|
|
}
|
|
|
|
} |