From c199785b98b41787dbe56e2efac13850f22bb315 Mon Sep 17 00:00:00 2001 From: MohammadTaha Basiri Date: Wed, 22 Dec 2021 10:41:45 +0330 Subject: [PATCH] dark theme configuration --- lib/config/design_config.dart | 131 +++-------- lib/config/theme_data.dart | 213 ++++++++++++++++++ lib/main.dart | 46 ++-- .../authentication/screens/verification.dart | 3 +- .../widgets/authentication_app_bar.dart | 8 +- lib/pages/home/home.dart | 5 + .../edit_profile/widgets/profile_photo.dart | 10 +- .../profile/edit_profile/widgets/switch.dart | 1 - lib/pages/home/profile/profile.dart | 3 +- lib/pages/home/profile/widgets/menu_item.dart | 13 +- lib/pages/home/radar/radar.dart | 3 +- .../home/radar/widgets/categories_list.dart | 9 +- .../home/radar/widgets/category_item.dart | 11 +- .../home/radar/widgets/search_field.dart | 12 +- lib/pages/home/widgets/bnb.dart | 17 +- lib/pages/splash/splash.dart | 26 ++- lib/providers/theme_provider.dart | 6 + lib/routes/route_generator.dart | 9 +- lib/utils/actions_sheet.dart | 2 +- lib/widgets/didvan/app_bar.dart | 5 +- lib/widgets/didvan/card.dart | 2 +- lib/widgets/didvan/divider.dart | 4 +- lib/widgets/didvan/text.dart | 5 +- lib/widgets/didvan/text_field.dart | 13 +- lib/widgets/item_title.dart | 11 +- pubspec.lock | 14 ++ pubspec.yaml | 1 + 27 files changed, 389 insertions(+), 194 deletions(-) create mode 100644 lib/config/theme_data.dart create mode 100644 lib/providers/theme_provider.dart diff --git a/lib/config/design_config.dart b/lib/config/design_config.dart index c8fca02..3b009c9 100644 --- a/lib/config/design_config.dart +++ b/lib/config/design_config.dart @@ -1,86 +1,9 @@ +import 'package:didvan/config/theme_data.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; class DesignConfig { - static const backgroundColor = Color(0XFFF8F8FA); - static const Color surfaceColor = Colors.white; - - static const Color lightPrimaryColor2 = Color(0XFFE6F3FA); - static const Color lightPrimaryColor3 = Color(0XFFF5FAFC); - static const Color primaryColor = Color(0XFF007EA7); - static const Color darkPrimaryColor2 = Color(0XFF1B3C59); - - static const Color secontCtaColor = Color(0XFFF5F5F5); - static const Color cardBorderColor = Color(0XFFEBEBEB); - static const Color borderColor = Color(0XFFE0E0E0); - static const Color hintColor = Color(0XFFBBBBBB); - static const Color captionColor = Color(0XFF666666); - - static const Color lightRedColor = Color(0XFFFFF8F8); - - static final ThemeData lightTheme = ThemeData( - primaryColor: primaryColor, - colorScheme: lightColorScheme, - fontFamily: 'Dana-FA', - appBarTheme: const AppBarTheme( - backgroundColor: backgroundColor, - foregroundColor: darkPrimaryColor2, - ), - textTheme: const TextTheme( - bodyText1: body1Text, - bodyText2: body2Text, - caption: captionText, - subtitle2: subtitle2Text, - subtitle1: subtitle1Text, - headline3: headline3Text, - ), - scaffoldBackgroundColor: backgroundColor, - ); - - static final ThemeData darkTheme = ThemeData(); - - static const ColorScheme lightColorScheme = ColorScheme( - primary: primaryColor, - primaryVariant: Color(0XFF1B3C59), - secondary: Color(0XFFD61515), - secondaryVariant: Color(0XFFA30001), - surface: surfaceColor, - background: backgroundColor, - error: Color(0XFFF00505), - onPrimary: Colors.white, - onSecondary: Colors.white, - onSurface: Color(0XFF1F1F1F), - onBackground: Color(0XFF1F1F1F), - onError: Colors.white, - brightness: Brightness.light, - ); - - static const ColorScheme currentColorScheme = lightColorScheme; - - static const TextStyle headline3Text = TextStyle( - fontSize: 20, - fontWeight: FontWeight.w600, - ); - static const TextStyle subtitle1Text = TextStyle( - fontSize: 17, - fontWeight: FontWeight.w700, - ); - static const TextStyle subtitle2Text = TextStyle( - fontSize: 15, - fontWeight: FontWeight.w700, - ); - static const TextStyle body1Text = TextStyle( - fontSize: 15, - fontWeight: FontWeight.w700, - ); - static const TextStyle body2Text = TextStyle( - fontSize: 15, - fontWeight: FontWeight.w400, - ); - static const TextStyle captionText = TextStyle( - fontSize: 13, - color: captionColor, - ); + static late BuildContext context; static const BorderRadius lowBorderRadius = BorderRadius.all( Radius.circular(8), @@ -91,29 +14,39 @@ class DesignConfig { static const BorderRadius highBorderRadius = BorderRadius.all( Radius.circular(16), ); - static final Border lightBorder = Border.all(color: DesignConfig.borderColor); - static final BoxDecoration actionCardDecoration = BoxDecoration( - color: lightPrimaryColor3, - boxShadow: defaultShadow, - borderRadius: mediumBorderRadius, + + static final Border cardBorder = Border.all( + color: Theme.of(context).colorScheme.cardBorder, + width: 0.25, ); - static final List defaultShadow = [ - BoxShadow( - color: currentColorScheme.primaryVariant.withOpacity(0.25), - blurRadius: 16, - spreadRadius: 0, - ) - ]; + + static List get defaultShadow => [ + BoxShadow( + color: const Color(0XFF1B3C59).withOpacity(0.25), + blurRadius: 16, + spreadRadius: 0, + ) + ]; static const Duration lowAnimationDuration = Duration(milliseconds: 300); static const Duration mediumAnimationDuration = Duration(milliseconds: 600); - static final SystemUiOverlayStyle systemUIOverlayStyle = SystemUiOverlayStyle( - statusBarBrightness: Brightness.dark, - statusBarIconBrightness: Brightness.dark, - statusBarColor: Colors.transparent, - systemNavigationBarColor: currentColorScheme.surface, - systemNavigationBarDividerColor: Colors.transparent, - systemNavigationBarIconBrightness: Brightness.dark, - ); + static SystemUiOverlayStyle get systemUiOverlayStyle { + return SystemUiOverlayStyle( + statusBarIconBrightness: Theme.of(context).brightness == Brightness.dark + ? Brightness.light + : Brightness.dark, + statusBarColor: Colors.transparent, + systemNavigationBarColor: Theme.of(context).colorScheme.surface, + systemNavigationBarDividerColor: Colors.transparent, + systemNavigationBarIconBrightness: + Theme.of(context).colorScheme.brightness == Brightness.dark + ? Brightness.light + : Brightness.dark, + ); + } + + static void updateSystemUiOverlayStyle() { + SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle); + } } diff --git a/lib/config/theme_data.dart b/lib/config/theme_data.dart new file mode 100644 index 0000000..d89b159 --- /dev/null +++ b/lib/config/theme_data.dart @@ -0,0 +1,213 @@ +import 'package:flutter/material.dart'; + +class LightThemeConfig { + static const Color _primary = Color(0XFF007EA7); + static const Color _white = Color(0XFFFFFFFF); + static const Color _black = Color(0XFF292929); + static const Color _background = Color(0XFFF8F8FA); + + static final ThemeData themeData = ThemeData( + backgroundColor: _background, + scaffoldBackgroundColor: _background, + colorScheme: _colorScheme, + fontFamily: 'Dana-FA', + textTheme: _textTheme, + ); + + static final TextTheme _textTheme = const TextTheme( + bodyText1: _body1Text, + bodyText2: _body2Text, + caption: _captionText, + subtitle2: _subtitle2Text, + subtitle1: _subtitle1Text, + headline3: _headline3Text, + ).apply(bodyColor: _black, displayColor: _black); + + static const ColorScheme _colorScheme = ColorScheme( + primary: _primary, + primaryVariant: _white, + secondary: Color(0XFFD61515), + secondaryVariant: _white, + surface: _white, + background: _background, + error: Color(0XFFF00505), + onPrimary: _white, + onSecondary: _white, + onSurface: _black, + onBackground: _white, + onError: _white, + brightness: Brightness.light, + ); + + static const TextStyle _headline3Text = TextStyle( + fontSize: 20, + fontWeight: FontWeight.w600, + ); + static const TextStyle _subtitle1Text = TextStyle( + fontSize: 17, + fontWeight: FontWeight.w700, + ); + static const TextStyle _subtitle2Text = TextStyle( + fontSize: 15, + fontWeight: FontWeight.w700, + ); + static const TextStyle _body1Text = TextStyle( + fontSize: 15, + fontWeight: FontWeight.w700, + ); + static const TextStyle _body2Text = TextStyle( + fontSize: 15, + fontWeight: FontWeight.w400, + ); + static const TextStyle _captionText = TextStyle( + fontSize: 13, + fontWeight: FontWeight.w400, + ); +} + +class DarkThemeConfig { + static const Color _primary = Color(0XFF007EA7); + static const Color _white = Color(0XFFFFFFFF); + static const Color _background = Color(0XFF202224); + + static final ThemeData themeData = ThemeData( + backgroundColor: _background, + scaffoldBackgroundColor: _background, + colorScheme: _colorScheme, + fontFamily: 'Dana-FA', + textTheme: _textTheme, + iconTheme: const IconThemeData( + color: text, + ), + ); + + static final TextTheme _textTheme = const TextTheme( + bodyText1: _body1Text, + bodyText2: _body2Text, + caption: _captionText, + subtitle2: _subtitle2Text, + subtitle1: _subtitle1Text, + headline3: _headline3Text, + ).apply(bodyColor: text, displayColor: text); + + static const ColorScheme _colorScheme = ColorScheme( + primary: _primary, + primaryVariant: _white, + secondary: Color(0XFFE53939), + secondaryVariant: _white, + surface: Color(0XFF181B1F), + background: _background, + error: Color(0XFFF53B3B), + onPrimary: _white, + onSecondary: _white, + onSurface: text, + onBackground: text, + onError: _white, + brightness: Brightness.dark, + ); + + static const TextStyle _headline3Text = TextStyle( + fontSize: 20, + fontWeight: FontWeight.w600, + ); + static const TextStyle _subtitle1Text = TextStyle( + fontSize: 17, + fontWeight: FontWeight.w700, + ); + static const TextStyle _subtitle2Text = TextStyle( + fontSize: 15, + fontWeight: FontWeight.w700, + ); + static const TextStyle _body1Text = TextStyle( + fontSize: 15, + fontWeight: FontWeight.w700, + ); + static const TextStyle _body2Text = TextStyle( + fontSize: 15, + fontWeight: FontWeight.w400, + ); + static const TextStyle _captionText = TextStyle( + fontSize: 13, + fontWeight: FontWeight.w400, + ); + + // Secondary colors + static const Color secondaryColor = Color(0XFFD61515); + static const Color secondaryDark = Color(0XFF703838); + + // Grey colors + static const Color white = Color(0XFFFFFFFF); + static const Color title = Color(0XFFF5F5F5); + static const Color text = Color(0XFFD6D6D6); + static const Color hint = Color(0XFFBBBBBB); + static const Color border = Color(0XFF666666); + + // Error and success + static const Color errorLight = Color(0XFFF0C9CD); + static const Color error = Color(0XFFF53B3B); + static const Color successLight = Color(0XFFBBD6B4); + static const Color success = Color(0XFF32A64C); +} + +extension DidvanColorScheme on ColorScheme { + // Secondary colors + Color get secondaryDisabled => brightness == Brightness.dark + ? const Color(0XFF703838) + : const Color(0XFFFFC8C8); + + Color get white => const Color(0XFFFFFFFF); + Color get focused => brightness == Brightness.dark + ? const Color(0XFF323C47) + : const Color(0XFFE6F3FA); + Color get navigation => brightness == Brightness.dark + ? const Color(0XFF181B1F) + : const Color(0XFF012348); + Color get focusedBorder => brightness == Brightness.dark + ? const Color(0XFFC8E0F4) + : const Color(0XFFE6F3FA); + Color get title => brightness == Brightness.dark + ? const Color(0XFFA3A3A3) + : const Color(0XFF1B3C59); + Color get text => brightness == Brightness.dark + ? const Color(0XFFA3A3A3) + : const Color(0XFF292929); + Color get inputText => brightness == Brightness.dark + ? const Color(0XFFA3A3A3) + : const Color(0XFF3D3D3D); + Color get caption => brightness == Brightness.dark + ? const Color(0XFFD6D6D6) + : const Color(0XFF666666); + Color get hint => const Color(0XFFBBBBBB); + Color get disabledText => brightness == Brightness.dark + ? const Color(0XFF666666) + : const Color(0XFFE0E0E0); + Color get border => brightness == Brightness.dark + ? const Color(0XFF666666) + : const Color(0XFFE0E0E0); + Color get cardBorder => brightness == Brightness.dark + ? const Color(0XFF666666) + : const Color(0XFFEBEBEB); + Color get disabledBackground => brightness == Brightness.dark + ? const Color(0XFF1F1F1F) + : const Color(0XFFE0E0E0); + Color get secondCTA => brightness == Brightness.dark + ? const Color(0XFF474747) + : const Color(0XFFF5F5F5); + Color get splash => brightness == Brightness.dark + ? const Color(0XFF333333) + : const Color(0XFFC8E0F4); + Color get black => brightness == Brightness.dark + ? const Color(0XFF1F1F1F) + : const Color(0XFF292929); + + // Error and success colors + Color get errorLight => brightness == Brightness.dark + ? const Color(0XFFF0C9CD) + : const Color(0XFFFFF8F8); + Color get successLight => brightness == Brightness.dark + ? const Color(0XFFBBD6B4) + : const Color(0XFFF5FFFC); + Color get success => brightness == Brightness.dark + ? const Color(0XFF32A64C) + : const Color(0XFF2BB24A); +} diff --git a/lib/main.dart b/lib/main.dart index 3282f6f..878f462 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,8 +1,8 @@ import 'package:didvan/config/design_config.dart'; +import 'package:didvan/config/theme_data.dart'; import 'package:didvan/providers/user_provider.dart'; import 'package:didvan/routes/route_generator.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:provider/provider.dart'; @@ -14,28 +14,30 @@ class Didvan extends StatelessWidget { const Didvan({Key? key}) : super(key: key); @override Widget build(BuildContext context) { - return ChangeNotifierProvider( - create: (context) => UserProvider(), - child: AnnotatedRegion( - value: DesignConfig.systemUIOverlayStyle, - child: MaterialApp( - debugShowCheckedModeBanner: false, - title: 'Didvan', - theme: DesignConfig.lightTheme, - darkTheme: DesignConfig.darkTheme, - themeMode: ThemeMode.light, - onGenerateRoute: (settings) => RouteGenerator.generateRoute(settings), - initialRoute: '/', - localizationsDelegates: const [ - GlobalCupertinoLocalizations.delegate, - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ], - supportedLocales: const [ - Locale("fa", "IR"), - ], - locale: const Locale("fa", "IR"), + return MultiProvider( + providers: [ + ChangeNotifierProvider( + create: (context) => UserProvider(), ), + ], + child: MaterialApp( + debugShowCheckedModeBanner: false, + title: 'Didvan', + theme: LightThemeConfig.themeData, + darkTheme: DarkThemeConfig.themeData, + color: LightThemeConfig.themeData.primaryColor, + themeMode: ThemeMode.light, + onGenerateRoute: (settings) => RouteGenerator.generateRoute(settings), + initialRoute: '/', + localizationsDelegates: const [ + GlobalCupertinoLocalizations.delegate, + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + supportedLocales: const [ + Locale("fa", "IR"), + ], + locale: const Locale("fa", "IR"), ), ); } diff --git a/lib/pages/authentication/screens/verification.dart b/lib/pages/authentication/screens/verification.dart index 9b31088..d0d3bde 100644 --- a/lib/pages/authentication/screens/verification.dart +++ b/lib/pages/authentication/screens/verification.dart @@ -1,4 +1,5 @@ import 'package:didvan/config/design_config.dart'; +import 'package:didvan/config/theme_data.dart'; import 'package:didvan/pages/authentication/authentication_state.dart'; import 'package:didvan/pages/authentication/widgets/authentication_layout.dart'; import 'package:didvan/widgets/didvan/button.dart'; @@ -47,7 +48,7 @@ class Verification extends StatelessWidget { pinTheme: PinTheme( fieldHeight: 48, fieldWidth: 48, - inactiveColor: DesignConfig.borderColor, + inactiveColor: Theme.of(context).colorScheme.border, activeFillColor: Theme.of(context).colorScheme.primary, activeColor: Theme.of(context).colorScheme.primary, borderRadius: DesignConfig.lowBorderRadius, diff --git a/lib/pages/authentication/widgets/authentication_app_bar.dart b/lib/pages/authentication/widgets/authentication_app_bar.dart index 3361f0f..7061c00 100644 --- a/lib/pages/authentication/widgets/authentication_app_bar.dart +++ b/lib/pages/authentication/widgets/authentication_app_bar.dart @@ -1,4 +1,4 @@ -import 'package:didvan/config/design_config.dart'; +import 'package:didvan/config/theme_data.dart'; import 'package:didvan/pages/authentication/authentication_state.dart'; import 'package:didvan/widgets/didvan/text.dart'; import 'package:flutter/material.dart'; @@ -16,9 +16,9 @@ class AuthenticationAppBar extends StatelessWidget { children: [ GestureDetector( onTap: () => context.read().currentPageIndex--, - child: const Icon( + child: Icon( Icons.arrow_back, - color: DesignConfig.darkPrimaryColor2, + color: Theme.of(context).colorScheme.title, ), ), const SizedBox( @@ -28,7 +28,7 @@ class AuthenticationAppBar extends StatelessWidget { DidvanText( title!, style: Theme.of(context).textTheme.subtitle2, - color: DesignConfig.darkPrimaryColor2, + color: Theme.of(context).colorScheme.title, ) ], ), diff --git a/lib/pages/home/home.dart b/lib/pages/home/home.dart index e6d8645..2928674 100644 --- a/lib/pages/home/home.dart +++ b/lib/pages/home/home.dart @@ -1,3 +1,4 @@ +import 'package:didvan/config/design_config.dart'; import 'package:didvan/pages/home/home_state.dart'; import 'package:didvan/pages/home/news/news.dart'; import 'package:didvan/pages/home/profile/profile.dart'; @@ -21,6 +22,10 @@ class _HomeState extends State with SingleTickerProviderStateMixin { @override void initState() { + Future.delayed(Duration(milliseconds: 500), () { + DesignConfig.context = context; + DesignConfig.updateSystemUiOverlayStyle(); + }); _tabController = TabController(length: 5, vsync: this); _tabController.addListener(() { context.read().currentPageIndex = _tabController.index; diff --git a/lib/pages/home/profile/edit_profile/widgets/profile_photo.dart b/lib/pages/home/profile/edit_profile/widgets/profile_photo.dart index 635ac3c..7ed6e5a 100644 --- a/lib/pages/home/profile/edit_profile/widgets/profile_photo.dart +++ b/lib/pages/home/profile/edit_profile/widgets/profile_photo.dart @@ -1,4 +1,4 @@ -import 'package:didvan/config/design_config.dart'; +import 'package:didvan/config/theme_data.dart'; import 'package:didvan/constants/app_icons.dart'; import 'package:flutter/material.dart'; @@ -17,14 +17,14 @@ class ProfilePhoto extends StatelessWidget { Container( height: 96, width: 96, - decoration: const BoxDecoration( + decoration: BoxDecoration( shape: BoxShape.circle, - color: DesignConfig.lightPrimaryColor2, + color: Theme.of(context).colorScheme.focused, ), - child: const Icon( + child: Icon( DidvanIcons.profile_solid, size: 60, - color: DesignConfig.darkPrimaryColor2, + color: Theme.of(context).colorScheme.title, ), ), const Positioned( diff --git a/lib/pages/home/profile/edit_profile/widgets/switch.dart b/lib/pages/home/profile/edit_profile/widgets/switch.dart index 940e1b1..6c07c4e 100644 --- a/lib/pages/home/profile/edit_profile/widgets/switch.dart +++ b/lib/pages/home/profile/edit_profile/widgets/switch.dart @@ -1,4 +1,3 @@ -import 'package:didvan/config/design_config.dart'; import 'package:didvan/pages/home/profile/widgets/menu_item.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; diff --git a/lib/pages/home/profile/profile.dart b/lib/pages/home/profile/profile.dart index f8cc451..fa74059 100644 --- a/lib/pages/home/profile/profile.dart +++ b/lib/pages/home/profile/profile.dart @@ -1,4 +1,3 @@ -import 'package:didvan/config/design_config.dart'; import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/pages/home/profile/widgets/menu_item.dart'; import 'package:didvan/pages/home/widgets/logo_app_bar.dart'; @@ -50,7 +49,7 @@ class Profile extends StatelessWidget { ), const DidvanDivider(), MenuItem( - title: 'پیام‌ها', + title: 'خروج از حساب کاربری', icon: DidvanIcons.sign_out_regular, color: Theme.of(context).colorScheme.secondary, onTap: () => {}, diff --git a/lib/pages/home/profile/widgets/menu_item.dart b/lib/pages/home/profile/widgets/menu_item.dart index 64a3510..5f4e855 100644 --- a/lib/pages/home/profile/widgets/menu_item.dart +++ b/lib/pages/home/profile/widgets/menu_item.dart @@ -1,4 +1,4 @@ -import 'package:didvan/config/design_config.dart'; +import 'package:didvan/config/theme_data.dart'; import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/widgets/didvan/text.dart'; import 'package:flutter/material.dart'; @@ -9,14 +9,14 @@ class MenuItem extends StatelessWidget { final String? suffix; final VoidCallback onTap; final Widget? trailing; - final Color color; + final Color? color; const MenuItem({ Key? key, required this.title, this.icon, this.suffix, required this.onTap, - this.color = DesignConfig.darkPrimaryColor2, + this.color, this.trailing, }) : super(key: key); @@ -28,13 +28,16 @@ class MenuItem extends StatelessWidget { children: [ if (icon != null) Icon(icon, size: 18, color: color), if (icon != null) const SizedBox(width: 4), - DidvanText(title, color: color), + DidvanText( + title, + color: color ?? Theme.of(context).colorScheme.title, + ), const Spacer(), trailing ?? Icon( DidvanIcons.angle_left_regular, size: 18, - color: color, + color: color ?? Theme.of(context).colorScheme.title, ), ], ), diff --git a/lib/pages/home/radar/radar.dart b/lib/pages/home/radar/radar.dart index 3921214..23cb1f6 100644 --- a/lib/pages/home/radar/radar.dart +++ b/lib/pages/home/radar/radar.dart @@ -1,4 +1,5 @@ import 'package:didvan/config/design_config.dart'; +import 'package:didvan/config/theme_data.dart'; import 'package:didvan/pages/home/radar/widgets/categories_gird.dart'; import 'package:didvan/pages/home/radar/widgets/categories_list.dart'; import 'package:didvan/pages/home/radar/widgets/search_field.dart'; @@ -55,7 +56,7 @@ class _RadarState extends State { child: DidvanText( 'آخرین رصد', style: Theme.of(context).textTheme.subtitle1, - color: DesignConfig.darkPrimaryColor2, + color: Theme.of(context).colorScheme.title, ), ), ), diff --git a/lib/pages/home/radar/widgets/categories_list.dart b/lib/pages/home/radar/widgets/categories_list.dart index e9b4f3a..76ca59c 100644 --- a/lib/pages/home/radar/widgets/categories_list.dart +++ b/lib/pages/home/radar/widgets/categories_list.dart @@ -1,4 +1,5 @@ import 'package:didvan/config/design_config.dart'; +import 'package:didvan/config/theme_data.dart'; import 'package:didvan/models/radar_category.dart'; import 'package:didvan/pages/home/radar/radar_state.dart'; import 'package:didvan/widgets/animated_visibility.dart'; @@ -47,9 +48,11 @@ class CategoriesList extends StatelessWidget { duration: DesignConfig.mediumAnimationDuration, child: _itemBuilder( RadarCategory(title: 'همه', asset: '', id: 0), + context, ), ), - for (var category in categories) _itemBuilder(category), + for (var category in categories) + _itemBuilder(category, context), ], ), ), @@ -58,7 +61,7 @@ class CategoriesList extends StatelessWidget { ); } - Widget _itemBuilder(RadarCategory category) { + Widget _itemBuilder(RadarCategory category, BuildContext context) { return Container( margin: const EdgeInsets.only(left: 12), width: 100, @@ -67,7 +70,7 @@ class CategoriesList extends StatelessWidget { child: DidvanText(category.title), decoration: BoxDecoration( border: Border.all( - color: DesignConfig.darkPrimaryColor2, + color: Theme.of(context).colorScheme.title, ), borderRadius: DesignConfig.lowBorderRadius, ), diff --git a/lib/pages/home/radar/widgets/category_item.dart b/lib/pages/home/radar/widgets/category_item.dart index 85f516c..bfbdbbb 100644 --- a/lib/pages/home/radar/widgets/category_item.dart +++ b/lib/pages/home/radar/widgets/category_item.dart @@ -1,4 +1,5 @@ import 'package:didvan/config/design_config.dart'; +import 'package:didvan/config/theme_data.dart'; import 'package:didvan/widgets/animated_visibility.dart'; import 'package:didvan/widgets/didvan/text.dart'; import 'package:flutter/material.dart'; @@ -27,7 +28,7 @@ class CategoryItem extends StatelessWidget { decoration: BoxDecoration( borderRadius: DesignConfig.lowBorderRadius, border: isColapsed - ? Border.all(color: DesignConfig.darkPrimaryColor2) + ? Border.all(color: Theme.of(context).colorScheme.title) : null, ), child: Column( @@ -38,7 +39,11 @@ class CategoryItem extends StatelessWidget { child: Container( width: ds.width / 5, height: ds.width / 5, - decoration: DesignConfig.actionCardDecoration, + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surface, + boxShadow: DesignConfig.defaultShadow, + borderRadius: DesignConfig.mediumBorderRadius, + ), padding: const EdgeInsets.all(8), child: Image.asset( asset, @@ -51,7 +56,7 @@ class CategoryItem extends StatelessWidget { DidvanText( title, style: Theme.of(context).textTheme.subtitle2, - color: DesignConfig.darkPrimaryColor2, + color: Theme.of(context).colorScheme.title, ), ], ), diff --git a/lib/pages/home/radar/widgets/search_field.dart b/lib/pages/home/radar/widgets/search_field.dart index 4d01a04..406cc8c 100644 --- a/lib/pages/home/radar/widgets/search_field.dart +++ b/lib/pages/home/radar/widgets/search_field.dart @@ -1,4 +1,4 @@ -import 'package:didvan/config/design_config.dart'; +import 'package:didvan/config/theme_data.dart'; import 'package:didvan/constants/app_icons.dart'; import 'package:flutter/material.dart'; @@ -46,12 +46,12 @@ class _SearchFieldState extends State { prefixIcon: const Icon( DidvanIcons.search_regular, ), - enabledBorder: const OutlineInputBorder( - borderRadius: BorderRadius.all( + enabledBorder: OutlineInputBorder( + borderRadius: const BorderRadius.all( Radius.circular(4), ), borderSide: BorderSide( - color: DesignConfig.borderColor, + color: Theme.of(context).colorScheme.border, ), ), fillColor: Colors.red, @@ -62,7 +62,7 @@ class _SearchFieldState extends State { ), border: InputBorder.none, hintText: 'جستجو مطلب در رادار', - hintStyle: const TextStyle(color: DesignConfig.hintColor), + hintStyle: TextStyle(color: Theme.of(context).colorScheme.hint), ), ), ); @@ -70,7 +70,7 @@ class _SearchFieldState extends State { Color _fillColor() { if (_focusNode.hasFocus) { - return DesignConfig.lightPrimaryColor3; + return Theme.of(context).colorScheme.surface; } return Theme.of(context).colorScheme.surface; } diff --git a/lib/pages/home/widgets/bnb.dart b/lib/pages/home/widgets/bnb.dart index d92f996..036c46c 100644 --- a/lib/pages/home/widgets/bnb.dart +++ b/lib/pages/home/widgets/bnb.dart @@ -1,4 +1,5 @@ import 'package:didvan/config/design_config.dart'; +import 'package:didvan/config/theme_data.dart'; import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/widgets/didvan/text.dart'; import 'package:flutter/material.dart'; @@ -40,8 +41,8 @@ class DidvanBNB extends StatelessWidget { _NavBarItem( isSelected: currentTabIndex == 2, title: 'رادار', - selectedIcon: DidvanIcons.news_solid, - unselectedIcon: DidvanIcons.news_regular, + selectedIcon: DidvanIcons.radar_solid, + unselectedIcon: DidvanIcons.radar_light, onTap: () => onTabChanged(2), ), _NavBarItem( @@ -85,7 +86,7 @@ class _NavBarItem extends StatelessWidget { child: Tooltip( message: title, decoration: BoxDecoration( - color: DesignConfig.darkPrimaryColor2, + color: Theme.of(context).colorScheme.title, borderRadius: DesignConfig.highBorderRadius, boxShadow: DesignConfig.defaultShadow, ), @@ -104,19 +105,23 @@ class _NavBarItem extends StatelessWidget { decoration: BoxDecoration( shape: BoxShape.circle, color: isSelected - ? DesignConfig.lightPrimaryColor2 + ? Theme.of(context).colorScheme.focused : Theme.of(context).colorScheme.surface, ), child: Icon( isSelected ? selectedIcon : unselectedIcon, size: 32, - color: isSelected ? DesignConfig.darkPrimaryColor2 : null, + color: isSelected + ? Theme.of(context).brightness == Brightness.dark + ? Theme.of(context).colorScheme.text + : Theme.of(context).colorScheme.title + : null, ), ), DidvanText( title, style: Theme.of(context).textTheme.caption, - color: DesignConfig.darkPrimaryColor2, + color: Theme.of(context).colorScheme.title, ), const Spacer(), ], diff --git a/lib/pages/splash/splash.dart b/lib/pages/splash/splash.dart index 36dc181..7e2645b 100644 --- a/lib/pages/splash/splash.dart +++ b/lib/pages/splash/splash.dart @@ -1,4 +1,6 @@ import 'package:didvan/config/design_config.dart'; +import 'package:didvan/config/theme_data.dart'; +import 'package:didvan/main.dart'; import 'package:didvan/routes/routes.dart'; import 'package:didvan/widgets/logos/didvan_horizontal_logo.dart'; import 'package:flutter/material.dart'; @@ -16,23 +18,29 @@ class _SplashState extends State { void initState() { Future.delayed( const Duration(seconds: 2), - () => Navigator.of(context).pushReplacementNamed( - Routes.home, - ), + () { + Navigator.of(context).pushReplacementNamed( + Routes.home, + ); + }, ); super.initState(); } @override Widget build(BuildContext context) { + DesignConfig.context = context; return AnnotatedRegion( - value: DesignConfig.systemUIOverlayStyle.copyWith( - systemNavigationBarColor: DesignConfig.lightPrimaryColor3, + value: DesignConfig.systemUiOverlayStyle.copyWith( + systemNavigationBarColor: Theme.of(context).colorScheme.focused, ), - child: Container( - padding: const EdgeInsets.all(60), - color: DesignConfig.lightPrimaryColor3, - child: const DidvanVerticalLogo(), + child: Scaffold( + body: Container( + alignment: Alignment.center, + padding: const EdgeInsets.all(60), + color: Theme.of(context).colorScheme.focused, + child: const DidvanVerticalLogo(), + ), ), ); } diff --git a/lib/providers/theme_provider.dart b/lib/providers/theme_provider.dart new file mode 100644 index 0000000..638c1c7 --- /dev/null +++ b/lib/providers/theme_provider.dart @@ -0,0 +1,6 @@ +import 'package:didvan/providers/core_provider.dart'; +import 'package:flutter/material.dart'; + +class ThemeProvider extends CoreProvier { + late ThemeMode themeMode; +} diff --git a/lib/routes/route_generator.dart b/lib/routes/route_generator.dart index ee73a39..581c2bb 100644 --- a/lib/routes/route_generator.dart +++ b/lib/routes/route_generator.dart @@ -1,4 +1,3 @@ -import 'package:didvan/config/design_config.dart'; import 'package:didvan/pages/authentication/authentication.dart'; import 'package:didvan/pages/authentication/authentication_state.dart'; import 'package:didvan/pages/home/home.dart'; @@ -57,12 +56,8 @@ class RouteGenerator { } static Route _createRoute(page) { - return PageRouteBuilder( - pageBuilder: (context, animation, secondaryAnimation) => page, - transitionDuration: DesignConfig.mediumAnimationDuration, - transitionsBuilder: (context, animation, secondaryAnimation, child) { - return FadeTransition(opacity: animation, child: child); - }, + return MaterialPageRoute( + builder: (context) => page, ); } } diff --git a/lib/utils/actions_sheet.dart b/lib/utils/actions_sheet.dart index 64926d0..50b2a2a 100644 --- a/lib/utils/actions_sheet.dart +++ b/lib/utils/actions_sheet.dart @@ -23,7 +23,7 @@ class ActionSheetUtils { static AnnotatedRegion _customSystemOverlayStyle({required Widget child}) { return AnnotatedRegion( - value: DesignConfig.systemUIOverlayStyle.copyWith( + value: DesignConfig.systemUiOverlayStyle.copyWith( systemNavigationBarColor: Colors.black45, ), child: child, diff --git a/lib/widgets/didvan/app_bar.dart b/lib/widgets/didvan/app_bar.dart index 7082b32..16e42fd 100644 --- a/lib/widgets/didvan/app_bar.dart +++ b/lib/widgets/didvan/app_bar.dart @@ -1,4 +1,5 @@ import 'package:didvan/config/design_config.dart'; +import 'package:didvan/config/theme_data.dart'; import 'package:didvan/models/view/app_bar_data.dart'; import 'package:didvan/widgets/didvan/text.dart'; import 'package:flutter/material.dart'; @@ -18,7 +19,7 @@ class DidvanAppBar extends StatelessWidget { children: [ IconButton( onPressed: () => Navigator.of(context).pop(), - color: DesignConfig.darkPrimaryColor2, + color: Theme.of(context).colorScheme.title, icon: const Icon(Icons.arrow_back), ), const SizedBox(width: 16), @@ -28,7 +29,7 @@ class DidvanAppBar extends StatelessWidget { DidvanText( appBarData.title!, style: Theme.of(context).textTheme.headline3, - color: DesignConfig.darkPrimaryColor2, + color: Theme.of(context).colorScheme.title, ), ], ), diff --git a/lib/widgets/didvan/card.dart b/lib/widgets/didvan/card.dart index 5b0e747..63e083a 100644 --- a/lib/widgets/didvan/card.dart +++ b/lib/widgets/didvan/card.dart @@ -12,7 +12,7 @@ class DidvanCard extends StatelessWidget { decoration: BoxDecoration( borderRadius: DesignConfig.lowBorderRadius, color: Theme.of(context).colorScheme.surface, - border: DesignConfig.lightBorder, + border: DesignConfig.cardBorder, ), child: child, ); diff --git a/lib/widgets/didvan/divider.dart b/lib/widgets/didvan/divider.dart index 5199b62..da16730 100644 --- a/lib/widgets/didvan/divider.dart +++ b/lib/widgets/didvan/divider.dart @@ -1,4 +1,4 @@ -import 'package:didvan/config/design_config.dart'; +import 'package:didvan/config/theme_data.dart'; import 'package:flutter/material.dart'; class DidvanDivider extends StatelessWidget { @@ -10,7 +10,7 @@ class DidvanDivider extends StatelessWidget { height: 1, width: double.infinity, margin: const EdgeInsets.symmetric(vertical: 16), - color: DesignConfig.borderColor, + color: Theme.of(context).colorScheme.border, ); } } diff --git a/lib/widgets/didvan/text.dart b/lib/widgets/didvan/text.dart index 3a0386c..ab33f69 100644 --- a/lib/widgets/didvan/text.dart +++ b/lib/widgets/didvan/text.dart @@ -1,4 +1,3 @@ -import 'package:didvan/config/design_config.dart'; import 'package:flutter/material.dart'; class DidvanText extends StatelessWidget { @@ -12,7 +11,7 @@ class DidvanText extends StatelessWidget { const DidvanText( this.text, { Key? key, - this.style = DesignConfig.body2Text, + this.style, this.color, this.fontSize, this.fontWeight, @@ -23,7 +22,7 @@ class DidvanText extends StatelessWidget { Widget build(BuildContext context) { return Text( text, - style: style!.copyWith( + style: (style ?? Theme.of(context).textTheme.bodyText2)!.copyWith( color: color, fontWeight: fontWeight, fontSize: fontSize, diff --git a/lib/widgets/didvan/text_field.dart b/lib/widgets/didvan/text_field.dart index 081fb08..aaed428 100644 --- a/lib/widgets/didvan/text_field.dart +++ b/lib/widgets/didvan/text_field.dart @@ -1,4 +1,5 @@ import 'package:didvan/config/design_config.dart'; +import 'package:didvan/config/theme_data.dart'; import 'package:didvan/widgets/didvan/text.dart'; import 'package:flutter/material.dart'; @@ -56,7 +57,7 @@ class _DidvanTextFieldState extends State { if (widget.title != null) DidvanText( widget.title!, - color: !widget.enabled ? DesignConfig.hintColor : null, + color: !widget.enabled ? Theme.of(context).colorScheme.hint : null, ), if (widget.title != null) const SizedBox(height: 8), Container( @@ -87,7 +88,7 @@ class _DidvanTextFieldState extends State { hintStyle: Theme.of(context) .textTheme .bodyText2! - .copyWith(color: DesignConfig.hintColor), + .copyWith(color: Theme.of(context).colorScheme.hint), ), ), ), @@ -101,18 +102,18 @@ class _DidvanTextFieldState extends State { } else if (_hasError) { return Theme.of(context).colorScheme.error; } - return DesignConfig.borderColor; + return Theme.of(context).colorScheme.border; } Color _fillColor() { if (!widget.enabled) { - return DesignConfig.secontCtaColor; + return Theme.of(context).colorScheme.secondCTA; } if (_focusNode.hasFocus) { - return DesignConfig.lightPrimaryColor3; + return Theme.of(context).colorScheme.focused; } if (_hasError) { - return DesignConfig.lightRedColor; + return Theme.of(context).colorScheme.errorLight; } return Theme.of(context).colorScheme.surface; } diff --git a/lib/widgets/item_title.dart b/lib/widgets/item_title.dart index ed8bb84..1ed15ad 100644 --- a/lib/widgets/item_title.dart +++ b/lib/widgets/item_title.dart @@ -1,17 +1,17 @@ -import 'package:didvan/config/design_config.dart'; +import 'package:didvan/config/theme_data.dart'; import 'package:didvan/widgets/didvan/text.dart'; import 'package:flutter/material.dart'; class ItemTitle extends StatelessWidget { final String title; final IconData? icon; - final Color color; + final Color? color; const ItemTitle({ Key? key, required this.title, this.icon, - this.color = DesignConfig.darkPrimaryColor2, + this.color, }) : super(key: key); @override @@ -21,12 +21,13 @@ class ItemTitle extends StatelessWidget { child: Row( mainAxisSize: MainAxisSize.min, children: [ - if (icon != null) Icon(icon, color: color), + if (icon != null) + Icon(icon, color: color ?? Theme.of(context).colorScheme.title), if (icon != null) const SizedBox(width: 4), DidvanText( title, style: Theme.of(context).textTheme.subtitle1, - color: DesignConfig.darkPrimaryColor2, + color: color ?? Theme.of(context).colorScheme.title, ) ], ), diff --git a/pubspec.lock b/pubspec.lock index 1cace8f..91d1327 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -43,6 +43,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.15.0" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" cupertino_icons: dependency: "direct main" description: @@ -86,6 +93,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + hive: + dependency: "direct main" + description: + name: hive + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" http: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 596b680..2d58c87 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -39,6 +39,7 @@ dependencies: provider: ^6.0.1 pin_code_fields: ^7.3.0 rive: ^0.7.33 + hive: ^2.0.5 dev_dependencies: flutter_test: