From dc7ed94382a32ba99e4de0a9f0f870a9c3c23dca Mon Sep 17 00:00:00 2001 From: MohammadTaha Basiri Date: Sun, 12 Dec 2021 18:23:53 +0330 Subject: [PATCH] D1APP-25 BNB --- lib/assets/animations/indicator.riv | Bin 7842 -> 7610 bytes lib/config/design_config.dart | 11 +- lib/pages/authentication/authentication.dart | 2 +- lib/pages/home/home.dart | 15 +- lib/pages/home/home_state.dart | 12 ++ lib/pages/home/radar/radar.dart | 4 +- .../home/radar/widgets/categories_gird.dart | 4 +- .../home/radar/widgets/categories_list.dart | 4 +- .../home/radar/widgets/category_item.dart | 4 +- lib/pages/home/widgets/didvan_bnb.dart | 129 ++++++++++++++++++ lib/routes/route_generator.dart | 6 +- lib/utils/actions_sheet.dart | 3 +- 12 files changed, 177 insertions(+), 17 deletions(-) create mode 100644 lib/pages/home/home_state.dart create mode 100644 lib/pages/home/widgets/didvan_bnb.dart diff --git a/lib/assets/animations/indicator.riv b/lib/assets/animations/indicator.riv index 6bc6ab88607f195578474ec0231d83ac462df878..0190c3e95fa0c05372c92e4d39551b830ff17835 100644 GIT binary patch literal 7610 zcmb_hcUTnH-rikVM9~G;!X9j>5Jd&Wh6dP~SqqvN8>e7FL?grsV!76cvBeUNEp}1S zn<$DV>Wx={nO&2BnrMtDSYjnNF|lC-HR|^}a~8zhFW+Au&$IK)&Uw#!e)T=GhXK84 z_o{{;Z+IE}3`URIcv?zwQfflV2h*bZB#$2%I&n%;RfD0-;bky9a2QM;K7Rq24K)vj z{=;Fh_DSKxRbptg*$6k)nuT@g_8JDaQ2yc(Vx zVVU>R&t>p6djuE_o@TS{!kK6nIyF7ZNy*f%xoo=s97%tkcrwC;zTB|iiLaiCmdW)K zX%g*x+th_EQl2R~qW;DRhd`XJ*-Iul@SG00yCR#-OzkG?2zgta1Ko*O@5BSH)z?Vo z)NV5M9o0r+b_mpF~WbD~_5ooE3;`M~6C4QLD`g zE=rA*$crDgO7yGYei~cyHWRB%9&<=RO;-=q@RM$5?BpM%u?o$85UQ~b^EwH{0b8gO zeVg&ShC?0=%q8(J!xg$?eT2+PeQOBBx-Y$5sIFgI86TSLqmp&wy%pNbKS*X_b!!Pk z;>W{W=%)yjnD%7DNnH@gwj{44b$GA}QOJ68h9k$j^VhcA*^ujW`#!gO8 z6Ta;6PH~BNEDS#@k<~k5C7NP7uCiUsU#v3kd9n*7#W!~1#V3zT1o!k;XpOCTD*N&2 z0TK0zoa0+Xkut%p56Kl3QP0-5>j)PbmfYA$XZ>_sVj;oRId47NTn5i~`OjAH6$51A ze&^~6MKv5MyOd7_V#u0oCmJ4jPQ&PG8<`juK@`j8eUr=7=->Ft^=w~$gTUX=&QAQv zK&Yz0J8nU~+e(~TU$|yxZOuIeVyou}2SN=$ zQt)NTrjeh&@1f9D_I#C%Jzh;9>emNE=_{zJbOS^n`*1ad;#z=+J(MWy=yR&K0}U?z z)QLBKd&*AwB#)A5{@1NF_UM^aAZE2{=Rls5);jUh8^uS+;#(G(rd91FvuPoZ#VWt7 zigF?I5I_t}>3M`?1wK}2!|Z5{^**#oa8yJR&-@ou_v9lRWrNkc-W1fcnekPn-VBG{ zoYMEM-7;jJzXLMSOz+J=+lrErE_CnsN+*3hy1T@teEu$9InWl_u+WJXDIdvr<<{03 zc{k%7g=U`l#mJ^Ne!f0}qau>HgApp?xeq+Inm3q&(&A9%Omu=w z{Q5jN$Kuhz#xoJ7XQG`gWCeIS^ZITlEj=lzY}SA!yc^ru-d+Xj^ke&-PJDAkiAu)& zx)8^CdTi(+G4tGE!j~Ps znND=#*a8{fO>e7_=<352>e{2)nPEo0uylH-o*D{V3;A9X)m)D(twpv`9hbjO{Z1?(~0hNnBnxg=&AamRVX@ZGjlF^EUpM26lwbJFy5faPMHm-%tALo!8HH{08*)&aU;GH1`bbVfU?>JOce}eN<3| zFU~(3{TGSu%YE3c}*w z)qA3!ZT%HMcqeRB@QwEXu`3RG;$eDSjh$W9U)V9>!8rxZi&&`Pw^K^&WYn(r6x!a@ zN@KmYG!=+j1+Xh>sbNmsd0yWfGIKx^g?8!y3b%ObZDEJUwp=ILlyF$XxgVd+B|fk2 z$h70*5SbZX#R-ncQi#*?PuGD;F6ph384S9n8h?SW6-??-@$XMdDDMs zUePRltoyaZ+nL=A6G^);embsPmVbp%+y*jP!$6@4vVIwN4!l7oaWWMU@SajWi7%o*=Ziy6 z>(8y`t*=e4S#;l^SbkmFkJ~-Rs2l!~u_8z^hR~>l2V11gT_6A{kFSg&z7lcA7X}vZ z7YR}6f#y(Z^Tz6q!9aN~^~lSD6tb$aH%RpmYdo1+c`{)xWLeLNL?I{cYO|WRRdVFd zV5(S(=icGY1LX1!0Ek}dd-fJdxamqLv9+SqVLziAR z1gXU3NTpn+%H?QBB}b;+`dzmClG@h^j_eeU{L|eT6ASBU^jsy;fC0TiPx^vtByiPe zB1!=Upiy$rlM2~z*NC7}k>3T-w)0%uxFU*5TO&$Pkg5ns-QxBJX%r{bC||9-@C2!Z zxP6rh&uZTJ+Al6r+@*cOrTxagD$9UM%Ca9K=$4Q-rKQq9Wo_{^3qBbG%l{&KVj3^4 zzvy12fy%;XHUIOqtazGX z0JKWqCH_tT1*yKl$aomvT-~`5q^iDu@O{Evj8^mKl^m(RZ-CR%BdCP;h*LP?(tAWN zXO#k>D)tvoGYs_jmuLX>^_B%&2n>|BOcdq2W4VsP04S8cP3xVZ3Wb8skjpy*AiC`F z{h065qWT1BdCTO8jn>^VFaxwy*oQfl*cYwlFDm&3(&e6Ou4zc@Rf3{i?`#rzYNBLYAh8YKlK9_I( zZ_ah`xhg52D=~d;#qvKJQSb0y6##*Pm$}judf%hC9piVfz|Th8uE1LgG8hak_)CLC zj=euy;jalQ<99lQ6TlB$kK(Tc0Z?gg5;z5cZir66UuFb>)tp%o+wwEoc4m`hXzKY~ zsE?Z>NX16m{-gsM@_s+iMW;3J%w;zNTk+LlAh;l3LBpGPyKuFPV2vCM3RdXtKF{s! z?prh55SbsZK3p~%I{U6gBfGPvDsF|y+`n?to{Kazb9MWlhTZN{6+e2nkW6N3AA1igD+{P~zoZh^) zL_!*MR_ORs%`_I%dXSstROkd39DR+IaY^wQiJZO{tI)@7EE=o+ahTiO59`7?#*tnr z8m?1nmC2rj)-si@j#63s1Lbi^DLdvw>o!B^CVm<$lg#I{6uNKs!(29ROM#oEBJB9a zR#_%l6VCBhCwE#(jJ9SOR73HxRu>&Np{vaH*4BSB!+_;Q)i7rot(pn%~HlsspLgwIA=WD=7KXWzXV#j5P& z?SpQQUL1o%_*-vXS8=ibXo;jQ`&govhWKdg!FfF`V2l0qW(8gT!r;P>E!XWN&IT>l zCY^wcI*$eMb<%W(P71KcrmHxD7Q!br^Ej&OdEbw@iM4T;sq5-_d(UNAgEfg&^udx zb)pUEvJ)SLIwzZ<&S@mnKI;UvFCZ0R$Glre7Vnmdw0vT+Rr`FahSJAWbM_5?C~4V96*wiz2K~_#35s)>3Nk5`|MYl z&S{z>v4@==xgq=4eB(sxBaSLKD!HCUl<3DY_58E9#3HA9xEJbvzoCX2CBcT2sddxH zJ2m0N@Y3zoQEYM@{R{>c@>{)HK`)P8SMYmspiFj5`9r2-?$lD*o^$uz3zfAnI?w|p zRKYi2Jd{XS_C1*@Ih$41CE=zUva-bFK%=t*oOoGChC~)e-IVFjnRnq3b>kB^WX|>V z3c{0aIPsx=eiHFJS1Qwp1x+=Ek5qM=TM;narE%R{^0XKRtmeI@pjYr`sAKkkPc!(0 z!KW{L;^31ApJez)&Q2UW!mygc2&jdz9!m9gBJz$TP S;oDU4ZT8C1{F`nAp#BG`>?f-L literal 7842 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 defaultShadow = [ BoxShadow( - color: const Color(0XFF4D4D4D).withOpacity(0.25), - offset: const Offset(0, 4), - blurRadius: 8, + color: currentColorScheme.primaryVariant.withOpacity(0.25), + blurRadius: 16, spreadRadius: 0, ) ]; - static const Duration defaultAnimationDuration = Duration(milliseconds: 600); + static const Duration lowAnimationDuration = Duration(milliseconds: 300); + static const Duration mediumAnimationDuration = Duration(milliseconds: 600); static final SystemUiOverlayStyle systemUIOverlayStyle = SystemUiOverlayStyle( statusBarBrightness: Brightness.dark, diff --git a/lib/pages/authentication/authentication.dart b/lib/pages/authentication/authentication.dart index ade5c92..0f8209e 100644 --- a/lib/pages/authentication/authentication.dart +++ b/lib/pages/authentication/authentication.dart @@ -27,7 +27,7 @@ class _AuthenticationState extends State { return Scaffold( body: Consumer( builder: (context, state, child) => AnimatedSwitcher( - duration: DesignConfig.defaultAnimationDuration, + duration: DesignConfig.mediumAnimationDuration, child: _pages[state.currentPageIndex], ), ), diff --git a/lib/pages/home/home.dart b/lib/pages/home/home.dart index aeed46a..7436f2e 100644 --- a/lib/pages/home/home.dart +++ b/lib/pages/home/home.dart @@ -1,9 +1,11 @@ +import 'package:didvan/pages/home/home_state.dart'; import 'package:didvan/pages/home/news/news.dart'; import 'package:didvan/pages/home/profile/profile.dart'; import 'package:didvan/pages/home/radar/radar.dart'; import 'package:didvan/pages/home/radar/radar_state.dart'; import 'package:didvan/pages/home/statistics/statistics.dart'; import 'package:didvan/pages/home/studio/studio..dart'; +import 'package:didvan/pages/home/widgets/didvan_bnb.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -20,7 +22,9 @@ class _HomeState extends State with SingleTickerProviderStateMixin { @override void initState() { _tabController = TabController(length: 5, vsync: this); - _tabController.addListener(() {}); + _tabController.addListener(() { + context.read().currentPageIndex = _tabController.index; + }); super.initState(); } @@ -44,6 +48,15 @@ class _HomeState extends State with SingleTickerProviderStateMixin { ], ), ), + bottomNavigationBar: Consumer( + builder: (context, state, child) => DidvanBNB( + currentTabIndex: state.currentPageIndex, + onTabChanged: (index) { + state.currentPageIndex = index; + _tabController.animateTo(index); + }, + ), + ), ); } } diff --git a/lib/pages/home/home_state.dart b/lib/pages/home/home_state.dart new file mode 100644 index 0000000..4d20216 --- /dev/null +++ b/lib/pages/home/home_state.dart @@ -0,0 +1,12 @@ +import 'package:didvan/providers/core_provider.dart'; + +class HomeState extends CoreProvier { + int _currentPageIndex = 0; + + set currentPageIndex(int value) { + _currentPageIndex = value; + notifyListeners(); + } + + int get currentPageIndex => _currentPageIndex; +} diff --git a/lib/pages/home/radar/radar.dart b/lib/pages/home/radar/radar.dart index 161f03e..7b27a89 100644 --- a/lib/pages/home/radar/radar.dart +++ b/lib/pages/home/radar/radar.dart @@ -30,7 +30,7 @@ class _RadarState extends State { _isAnimating = true; await _scrollController.animateTo( 380, - duration: DesignConfig.defaultAnimationDuration, + duration: DesignConfig.mediumAnimationDuration, curve: Curves.ease, ); _isAnimating = false; @@ -40,7 +40,7 @@ class _RadarState extends State { _isAnimating = true; await _scrollController.animateTo( 0, - duration: DesignConfig.defaultAnimationDuration, + duration: DesignConfig.mediumAnimationDuration, curve: Curves.ease, ); _isAnimating = false; diff --git a/lib/pages/home/radar/widgets/categories_gird.dart b/lib/pages/home/radar/widgets/categories_gird.dart index eca753b..cb51cd4 100644 --- a/lib/pages/home/radar/widgets/categories_gird.dart +++ b/lib/pages/home/radar/widgets/categories_gird.dart @@ -12,7 +12,7 @@ class CategoriesRow1 extends StatelessWidget { Widget build(BuildContext context) { final MediaQueryData d = MediaQuery.of(context); return AnimatedPositioned( - duration: DesignConfig.defaultAnimationDuration, + duration: DesignConfig.mediumAnimationDuration, top: isColapsed ? 12 : 176 + d.padding.top, left: isColapsed ? -d.size.width : 0, right: isColapsed ? d.size.width : 0, @@ -51,7 +51,7 @@ class CategoriesRow2 extends StatelessWidget { Widget build(BuildContext context) { final MediaQueryData d = MediaQuery.of(context); return AnimatedPositioned( - duration: DesignConfig.defaultAnimationDuration, + duration: DesignConfig.mediumAnimationDuration, top: isColapsed ? -60 : 300 + d.padding.top, left: isColapsed ? -80 : 0, right: isColapsed ? 124 : 0, diff --git a/lib/pages/home/radar/widgets/categories_list.dart b/lib/pages/home/radar/widgets/categories_list.dart index 9d6cb38..e9b4f3a 100644 --- a/lib/pages/home/radar/widgets/categories_list.dart +++ b/lib/pages/home/radar/widgets/categories_list.dart @@ -24,7 +24,7 @@ class CategoriesList extends StatelessWidget { child: AnimatedCrossFade( crossFadeState: isColapsed ? CrossFadeState.showSecond : CrossFadeState.showFirst, - duration: DesignConfig.defaultAnimationDuration, + duration: DesignConfig.mediumAnimationDuration, firstChild: const SizedBox(), secondChild: Container( height: 60 + d.padding.top, @@ -44,7 +44,7 @@ class CategoriesList extends StatelessWidget { children: [ AnimatedVisibility( isVisible: isColapsed, - duration: DesignConfig.defaultAnimationDuration, + duration: DesignConfig.mediumAnimationDuration, child: _itemBuilder( RadarCategory(title: 'همه', asset: '', id: 0), ), diff --git a/lib/pages/home/radar/widgets/category_item.dart b/lib/pages/home/radar/widgets/category_item.dart index 48560ae..85f516c 100644 --- a/lib/pages/home/radar/widgets/category_item.dart +++ b/lib/pages/home/radar/widgets/category_item.dart @@ -20,7 +20,7 @@ class CategoryItem extends StatelessWidget { final Size ds = MediaQuery.of(context).size; return Center( child: AnimatedContainer( - duration: DesignConfig.defaultAnimationDuration, + duration: DesignConfig.mediumAnimationDuration, padding: isColapsed ? const EdgeInsets.all(4) : EdgeInsets.zero, width: isColapsed ? 100 : ds.width / 3, alignment: Alignment.center, @@ -33,7 +33,7 @@ class CategoryItem extends StatelessWidget { child: Column( children: [ AnimatedVisibility( - duration: DesignConfig.defaultAnimationDuration, + duration: DesignConfig.mediumAnimationDuration, isVisible: !isColapsed, child: Container( width: ds.width / 5, diff --git a/lib/pages/home/widgets/didvan_bnb.dart b/lib/pages/home/widgets/didvan_bnb.dart new file mode 100644 index 0000000..d1f3d91 --- /dev/null +++ b/lib/pages/home/widgets/didvan_bnb.dart @@ -0,0 +1,129 @@ +import 'package:didvan/config/design_config.dart'; +import 'package:didvan/constants/app_icons.dart'; +import 'package:didvan/widgets/didvan/text.dart'; +import 'package:flutter/material.dart'; + +class DidvanBNB extends StatelessWidget { + final int currentTabIndex; + final void Function(int index) onTabChanged; + + const DidvanBNB( + {Key? key, required this.currentTabIndex, required this.onTabChanged}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + height: 64, + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surface, + borderRadius: const BorderRadius.vertical(top: Radius.circular(16)), + boxShadow: DesignConfig.defaultShadow, + ), + padding: const EdgeInsets.symmetric(horizontal: 12), + child: Row( + children: [ + _NavBarItem( + isSelected: currentTabIndex == 0, + title: 'اخبار', + selectedIcon: DidvanIcons.news_solid, + unselectedIcon: DidvanIcons.news_light, + onTap: () => onTabChanged(0), + ), + _NavBarItem( + isSelected: currentTabIndex == 1, + title: 'آمار', + selectedIcon: DidvanIcons.chart_solid, + unselectedIcon: DidvanIcons.chart_light, + onTap: () => onTabChanged(1), + ), + _NavBarItem( + isSelected: currentTabIndex == 2, + title: 'رادار', + selectedIcon: DidvanIcons.news_solid, + unselectedIcon: DidvanIcons.news_regular, + onTap: () => onTabChanged(2), + ), + _NavBarItem( + isSelected: currentTabIndex == 3, + title: 'استودیو', + selectedIcon: DidvanIcons.play_circle_solid, + unselectedIcon: DidvanIcons.play_circle_light, + onTap: () => onTabChanged(3), + ), + _NavBarItem( + isSelected: currentTabIndex == 4, + title: 'پروفایل', + selectedIcon: DidvanIcons.profile_solid, + unselectedIcon: DidvanIcons.profile_light, + onTap: () => onTabChanged(4), + ), + ], + ), + ); + } +} + +class _NavBarItem extends StatelessWidget { + final VoidCallback onTap; + final bool isSelected; + final String title; + final IconData selectedIcon; + final IconData unselectedIcon; + const _NavBarItem({ + Key? key, + required this.isSelected, + required this.title, + required this.selectedIcon, + required this.unselectedIcon, + required this.onTap, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Expanded( + child: Tooltip( + message: title, + decoration: BoxDecoration( + color: DesignConfig.darkPrimaryColor2, + borderRadius: DesignConfig.highBorderRadius, + boxShadow: DesignConfig.defaultShadow, + ), + child: GestureDetector( + onTap: onTap, + child: Container( + color: Colors.transparent, + child: Column( + children: [ + const SizedBox( + height: 4, + ), + AnimatedContainer( + padding: const EdgeInsets.all(4), + duration: DesignConfig.lowAnimationDuration, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: isSelected + ? DesignConfig.lightPrimaryColor2 + : Theme.of(context).colorScheme.surface, + ), + child: Icon( + isSelected ? selectedIcon : unselectedIcon, + size: 32, + color: isSelected ? DesignConfig.darkPrimaryColor2 : null, + ), + ), + DidvanText( + title, + style: Theme.of(context).textTheme.caption, + color: DesignConfig.darkPrimaryColor2, + ), + const Spacer(), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/routes/route_generator.dart b/lib/routes/route_generator.dart index 7ea510f..f904a45 100644 --- a/lib/routes/route_generator.dart +++ b/lib/routes/route_generator.dart @@ -1,6 +1,7 @@ import 'package:didvan/pages/authentication/authentication.dart'; import 'package:didvan/pages/authentication/authentication_state.dart'; import 'package:didvan/pages/home/home.dart'; +import 'package:didvan/pages/home/home_state.dart'; import 'package:didvan/pages/home/radar/radar.dart'; import 'package:didvan/pages/home/radar/radar_state.dart'; import 'package:didvan/pages/splash/splash.dart'; @@ -28,7 +29,10 @@ class RouteGenerator { ); case Routes.home: return _materialPageRouteGenerator( - const Home(), + ChangeNotifierProvider( + create: (context) => HomeState(), + child: const Home(), + ), ); default: return _errorRoute(); diff --git a/lib/utils/actions_sheet.dart b/lib/utils/actions_sheet.dart index 29a2299..fa63022 100644 --- a/lib/utils/actions_sheet.dart +++ b/lib/utils/actions_sheet.dart @@ -10,7 +10,8 @@ class ActionSheetUtils { context: context, builder: (context) => Padding( padding: EdgeInsets.symmetric( - horizontal: MediaQuery.of(context).size.width / 3), + horizontal: MediaQuery.of(context).size.width / 3, + ), child: const RiveAnimation.asset(Assets.logoLoadingAnimation), ), );