Activate light and dark theme

main_design2.0
zaid_daoud 2 years ago
parent 5a645f13c0
commit a8a7b5a613

@ -1,10 +1,15 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:localization/localization.dart'; import 'package:localization/localization.dart';
import 'package:provider/provider.dart';
import '../controllers/providers/settings/setting_provider.dart';
import '../models/enums/translation_keys.dart'; import '../models/enums/translation_keys.dart';
extension BuildContextExtension on BuildContext { extension BuildContextExtension on BuildContext {
String translate(TranslationKeys translationKey) { String translate(TranslationKeys translationKey) {
return translationKey.name.i18n([Localizations.localeOf(this).toString()]); return translationKey.name.i18n([Localizations.localeOf(this).toString()]);
} }
bool get isDark => Provider.of<SettingProvider>(this).theme.brightness == Brightness.dark;
} }

@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:localization/localization.dart'; import 'package:localization/localization.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/new_views/app_style/app_themes.dart'; import 'package:test_sa/new_views/app_style/app_themes.dart';
import 'package:test_sa/new_views/pages/land_page/land_page.dart';
import 'package:test_sa/new_views/pages/login_page.dart'; import 'package:test_sa/new_views/pages/login_page.dart';
import 'package:test_sa/new_views/pages/splash_page.dart'; import 'package:test_sa/new_views/pages/splash_page.dart';
@ -64,6 +65,7 @@ class MyApp extends StatelessWidget {
routes: { routes: {
SplashPage.routeName: (_) => const SplashPage(), SplashPage.routeName: (_) => const SplashPage(),
LoginPage.routeName: (_) => const LoginPage(), LoginPage.routeName: (_) => const LoginPage(),
LandPage.routeName: (_) => const LandPage(),
}, },
), ),
), ),

@ -10,6 +10,7 @@ class AppColor {
static const Color primary70 = Color(0xff163A51); static const Color primary70 = Color(0xff163A51);
//texts //texts
static const Color neutral10 = Color(0xffBCBCBC);
static const Color neutral20 = Color(0xff767676); static const Color neutral20 = Color(0xff767676);
static const Color neutral30 = Color(0xffEAF1F4); static const Color neutral30 = Color(0xffEAF1F4);
static const Color neutral40 = Color(0xffE4E5E6); static const Color neutral40 = Color(0xffE4E5E6);
@ -19,7 +20,7 @@ class AppColor {
//background //background
static const Color backgroundLight = Color(0xffF7F9FB); static const Color backgroundLight = Color(0xffF7F9FB);
static const Color backgroundDark = neutral50; static const Color backgroundDark = Color(0xff111427);
//red //red
static const Color red40 = Color(0xffFFDBDC); static const Color red40 = Color(0xffFFDBDC);

@ -3,20 +3,18 @@ import 'package:test_sa/new_views/app_style/app_color.dart';
class AppThemes { class AppThemes {
AppThemes._(); AppThemes._();
static final ThemeData _data = ThemeData( static ThemeData lightTheme = ThemeData.light().copyWith(
fontFamily: "Poppins", textTheme: ThemeData.light().textTheme.apply(fontFamily: "Poppins"),
primaryColor: AppColor.primary50, primaryColor: AppColor.primary50,
indicatorColor: AppColor.primary50, indicatorColor: AppColor.primary50,
);
static ThemeData lightTheme = _data.copyWith(
brightness: Brightness.light,
scaffoldBackgroundColor: AppColor.backgroundLight, scaffoldBackgroundColor: AppColor.backgroundLight,
colorScheme: const ColorScheme.light(primary: AppColor.primary50, onPrimary: Colors.white, secondary: Colors.white, onSecondary: AppColor.neutral70), colorScheme: const ColorScheme.light(primary: AppColor.primary50, onPrimary: Colors.white, secondary: Colors.white, onSecondary: AppColor.neutral70),
); );
static ThemeData darkTheme = _data.copyWith( static ThemeData darkTheme = ThemeData.dark().copyWith(
brightness: Brightness.dark, textTheme: ThemeData.light().textTheme.apply(fontFamily: "Poppins"),
primaryColor: AppColor.primary50,
indicatorColor: AppColor.primary50,
scaffoldBackgroundColor: AppColor.backgroundDark, scaffoldBackgroundColor: AppColor.backgroundDark,
colorScheme: const ColorScheme.light(primary: AppColor.primary50, onPrimary: AppColor.neutral60, secondary: AppColor.neutral60, onSecondary: Colors.white), colorScheme: const ColorScheme.light(primary: AppColor.primary50, onPrimary: AppColor.neutral60, secondary: AppColor.neutral60, onSecondary: Colors.white),
); );

@ -0,0 +1,48 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import '../../controllers/providers/api/user_provider.dart';
import '../../controllers/providers/settings/setting_provider.dart';
import '../../models/enums/translation_keys.dart';
import '../app_style/app_themes.dart';
import 'app_filled_button.dart';
class AppDrawer extends StatelessWidget {
const AppDrawer({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
final settingProvider = Provider.of<SettingProvider>(context, listen: false);
final userProvider = Provider.of<UserProvider>(context, listen: false);
return Drawer(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
AppFilledButton(
label: TranslationKeys.login,
onPressed: () async {
// bool result = await showDialog(
// context: context,
// builder: (_) => const AAlertDialog(
// title: "_subtitle.signOut",
// content: "_subtitle.signOutAlert",
// ),
// );
if (true) {
settingProvider.resetSettings();
userProvider.reset();
Navigator.of(context).pop();
}
}),
Switch.adaptive(
value: context.isDark,
onChanged: (dark) {
Provider.of<SettingProvider>(context, listen: false).setTheme(dark ? AppThemes.darkTheme : AppThemes.lightTheme);
},
),
],
),
);
}
}

@ -68,7 +68,7 @@ class _AppTextFormFieldState extends State<AppTextFormField> {
Container( Container(
height: widget.textInputType == TextInputType.multiline ? null : 56.toScreenHeight, height: widget.textInputType == TextInputType.multiline ? null : 56.toScreenHeight,
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: context.isDark ? AppColor.neutral50 : Colors.white,
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
), ),
@ -99,8 +99,8 @@ class _AppTextFormFieldState extends State<AppTextFormField> {
enabledBorder: InputBorder.none, enabledBorder: InputBorder.none,
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
constraints: const BoxConstraints(), constraints: const BoxConstraints(),
errorStyle: Theme.of(context).textTheme.bodySmall?.copyWith(color: AppColor.red60, height: 0.7), errorStyle: Theme.of(context).textTheme.bodySmall?.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60, height: 0.7),
floatingLabelStyle: Theme.of(context).textTheme.labelLarge?.copyWith(color: AppColor.neutral20, fontWeight: FontWeight.w500), floatingLabelStyle: Theme.of(context).textTheme.labelLarge?.copyWith(color: context.isDark ? null : AppColor.neutral20, fontWeight: FontWeight.w500),
hintText: widget.hintText != null ? context.translate(widget.hintText) : null, hintText: widget.hintText != null ? context.translate(widget.hintText) : null,
labelText: widget.labelText != null ? context.translate(widget.labelText) : null, labelText: widget.labelText != null ? context.translate(widget.labelText) : null,
suffixIcon: widget.prefixIconData == null suffixIcon: widget.prefixIconData == null

@ -0,0 +1,30 @@
import 'package:flutter/material.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import '../../app_style/app_color.dart';
class DashboardPageIndicator extends StatelessWidget {
final PageController controller;
final int index, currentPage;
const DashboardPageIndicator({
Key key,
@required this.controller,
@required this.index,
@required this.currentPage,
}) : super(key: key);
@override
Widget build(BuildContext context) {
final bool isActive = currentPage == (index + 1);
return InkWell(
onTap: () {
controller.animateToPage(index, duration: const Duration(milliseconds: 500), curve: Curves.ease);
},
child: Container(
width: (isActive ? 30 : 16).toScreenWidth,
height: 9.toScreenHeight,
decoration: BoxDecoration(color: isActive ? AppColor.green50 : AppColor.neutral40, borderRadius: BorderRadius.circular(8)),
),
);
}
}

@ -0,0 +1,112 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import '../../common_widgets/app_drawer.dart';
import 'dashboard_page_indicator.dart';
class LandPage extends StatefulWidget {
static const String routeName = "/land-page";
const LandPage({Key key}) : super(key: key);
@override
State<LandPage> createState() => _LandPageState();
}
class _LandPageState extends State<LandPage> {
PageController _controller;
int _currentPage = 1;
@override
void initState() {
super.initState();
_controller = PageController()
..addListener(() {
_currentPage = _controller.page.toInt() + 1;
setState(() {});
});
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async {
// bool result = await showDialog(
// context: context,
// builder: (_) => const AAlertDialog(
// title: "_subtitle.exit",
// content: "_subtitle.exitAlert",
// ),
// );
if (true) {
if (Platform.isAndroid) {
SystemChannels.platform.invokeMethod('SystemNavigator.pop');
} else {
exit(0);
}
}
return false;
},
child: Scaffold(
appBar: AppBar(),
body: Padding(
padding: EdgeInsets.only(left: 16.toScreenWidth, top: 11.toScreenHeight),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
DashboardPageIndicator(index: 0, currentPage: _currentPage, controller: _controller),
3.width,
DashboardPageIndicator(index: 1, currentPage: _currentPage, controller: _controller),
3.width,
DashboardPageIndicator(index: 2, currentPage: _currentPage, controller: _controller),
10.width,
Text(
"0$_currentPage/03",
style: Theme.of(context).textTheme.labelMedium?.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? AppColor.neutral40 : AppColor.neutral60),
),
],
),
8.height,
Expanded(
child: PageView(
controller: _controller,
children: const [
Center(
child: Text('First Page'),
),
Center(
child: Text('Second Page'),
),
Center(
child: Text('Third Page'),
),
],
),
),
],
),
),
bottomNavigationBar: BottomNavigationBar(
items: [
BottomNavigationBarItem(icon: Icon(Icons.add), label: "add"),
BottomNavigationBarItem(icon: Icon(Icons.add), label: "add"),
BottomNavigationBarItem(icon: Icon(Icons.add), label: "add"),
],
),
drawer: const AppDrawer(),
),
);
}
}

@ -7,6 +7,7 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/models/enums/translation_keys.dart'; import 'package:test_sa/models/enums/translation_keys.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart'; import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
import 'package:test_sa/new_views/pages/land_page/land_page.dart';
import '../../controllers/providers/api/user_provider.dart'; import '../../controllers/providers/api/user_provider.dart';
import '../../controllers/providers/settings/setting_provider.dart'; import '../../controllers/providers/settings/setting_provider.dart';
@ -57,11 +58,11 @@ class _LoginPageState extends State<LoginPage> {
64.height, 64.height,
Text( Text(
context.translate(TranslationKeys.login), context.translate(TranslationKeys.login),
style: Theme.of(context).textTheme.headlineSmall?.copyWith(color: AppColor.neutral50, fontWeight: FontWeight.w600), style: Theme.of(context).textTheme.headlineSmall?.copyWith(color: context.isDark ? AppColor.primary50 : AppColor.neutral50, fontWeight: FontWeight.w600),
), ),
Text( Text(
context.translate(TranslationKeys.enterCredsToLogin), context.translate(TranslationKeys.enterCredsToLogin),
style: Theme.of(context).textTheme.titleMedium?.copyWith(color: AppColor.neutral20, fontWeight: FontWeight.w500), style: Theme.of(context).textTheme.titleMedium?.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20, fontWeight: FontWeight.w500),
), ),
32.height, 32.height,
AppTextFormField( AppTextFormField(
@ -122,8 +123,7 @@ class _LoginPageState extends State<LoginPage> {
Navigator.pop(context); Navigator.pop(context);
if (status >= 200 && status < 300 && _userProvider.user.isAuthenticated ?? false) { if (status >= 200 && status < 300 && _userProvider.user.isAuthenticated ?? false) {
_settingProvider.setUser(_userProvider.user); _settingProvider.setUser(_userProvider.user);
Navigator.pushNamed(context, LandPage.routeName);
/// TODO [zaid] : push to home page
} else { } else {
Fluttertoast.showToast(msg: _userProvider.user.message); Fluttertoast.showToast(msg: _userProvider.user.message);
} }

@ -11,6 +11,7 @@ import 'package:test_sa/models/app_notification.dart';
import 'package:test_sa/new_views/pages/login_page.dart'; import 'package:test_sa/new_views/pages/login_page.dart';
import '../../models/size_config.dart'; import '../../models/size_config.dart';
import 'land_page/land_page.dart';
class SplashPage extends StatefulWidget { class SplashPage extends StatefulWidget {
static const String routeName = '/splash_page'; static const String routeName = '/splash_page';
@ -49,10 +50,10 @@ class _SplashPageState extends State<SplashPage> {
fit: BoxFit.contain, fit: BoxFit.contain,
animation: "splash", animation: "splash",
callback: (animation) async { callback: (animation) async {
Navigator.of(context).pushNamed(LoginPage.routeName); Navigator.of(context).pushNamedAndRemoveUntil(LoginPage.routeName, (routes) => true);
if (_settingProvider.isLoaded && (_settingProvider.user?.isLiveToken ?? false)) { if (_settingProvider.isLoaded && (_settingProvider.user?.isLiveToken ?? false)) {
_userProvider.user = _settingProvider.user; _userProvider.user = _settingProvider.user;
// TODO [zaid] : push to home page Navigator.of(context).pushNamedAndRemoveUntil(LandPage.routeName, (routes) => true);
} }
}, },
), ),

@ -37,6 +37,7 @@ import 'package:url_launcher/url_launcher.dart';
import '../../widgets/land_page/land_page_item.dart'; import '../../widgets/land_page/land_page_item.dart';
import 'requests/requests_page.dart'; import 'requests/requests_page.dart';
@Deprecated("Use the widget inside the [new_views/pages/land_page] folder")
class LandPage extends StatefulWidget { class LandPage extends StatefulWidget {
static const String id = "/land-page"; static const String id = "/land-page";

Loading…
Cancel
Save