initial commit

This commit is contained in:
2025-11-28 23:58:41 +03:00
commit 013690061c
77 changed files with 2337 additions and 0 deletions

34
lib/theme/theme_data.dart Normal file
View File

@@ -0,0 +1,34 @@
import 'package:base_project/theme/theme_schema.dart';
import 'package:flutter/material.dart';
class LightTheme extends ThemeSchema {
LightTheme() : super(
brightness: Brightness.light,
textTheme: TextThemeSchema(
title: const TextStyle(),
body: const TextStyle()
),
colorTheme: ColorThemeSchema(
primary: Colors.black,
secondary: Colors.white
)
);
}
class DarkTheme extends ThemeSchema {
DarkTheme() : super(
brightness: Brightness.dark,
textTheme: TextThemeSchema(
title: const TextStyle(),
body: const TextStyle()
),
colorTheme: ColorThemeSchema(
primary: Colors.white,
secondary: Colors.black
)
);
}

View 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;
}
}

View File

@@ -0,0 +1,39 @@
import 'package:flutter/material.dart';
class ThemeSchema {
Brightness brightness;
TextThemeSchema textTheme;
ColorThemeSchema colorTheme;
ThemeSchema({
required this.brightness,
required this.textTheme,
required this.colorTheme,
});
}
class TextThemeSchema {
TextStyle title;
TextStyle body;
TextThemeSchema({
required this.title,
required this.body,
});
}
class ColorThemeSchema {
Color primary;
Color secondary;
ColorThemeSchema({
required this.primary,
required this.secondary,
});
}