From fc749de77ea9af00cef75bb6475c128d083c252f Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Tue, 21 Jul 2020 12:16:32 +0300 Subject: [PATCH] create doctor card and medical page --- assets/images/Icon-awesome-calendar.png | Bin 0 -> 408 bytes assets/images/medical/doctor_icon.png | Bin 0 -> 1073 bytes .../medical/insurance_approvals_icon.png | Bin 0 -> 1040 bytes assets/images/medical/insurance_card_icon.png | Bin 0 -> 700 bytes assets/images/medical/lab_result_icon.png | Bin 0 -> 1208 bytes .../images/medical/medical_history_icon.png | Bin 0 -> 1189 bytes assets/images/medical/prescription_icon.png | Bin 0 -> 990 bytes assets/images/medical/radiology_icon.png | Bin 0 -> 1491 bytes ios/Flutter/Debug.xcconfig | 1 + ios/Flutter/Release.xcconfig | 1 + lib/main.dart | 3 +- lib/pages/landing/landing_page.dart | 4 +- lib/pages/medical/medical_page.dart | 132 ++++++++++++++++++ lib/pages/medical/my_admissions_page.dart | 61 ++++++++ lib/widgets/avatar/large_avatar.dart | 8 +- .../data_display/medical/doctor_card.dart | 99 +++++++++++++ .../medical/medical_profile_item.dart | 53 +++++++ lib/widgets/others/StarRating.dart | 39 ++++++ .../others/app_expandable_notifier.dart | 8 +- lib/widgets/others/card_with_bg_widget.dart | 71 ++++++++++ .../others/rounded_container_widget.dart | 86 ++++++++++++ .../others/sliver_app_bar_delegate.dart | 34 +++++ pubspec.yaml | 1 + 23 files changed, 591 insertions(+), 10 deletions(-) create mode 100644 assets/images/Icon-awesome-calendar.png create mode 100644 assets/images/medical/doctor_icon.png create mode 100644 assets/images/medical/insurance_approvals_icon.png create mode 100644 assets/images/medical/insurance_card_icon.png create mode 100644 assets/images/medical/lab_result_icon.png create mode 100644 assets/images/medical/medical_history_icon.png create mode 100644 assets/images/medical/prescription_icon.png create mode 100644 assets/images/medical/radiology_icon.png create mode 100644 lib/pages/medical/medical_page.dart create mode 100644 lib/pages/medical/my_admissions_page.dart create mode 100644 lib/widgets/data_display/medical/doctor_card.dart create mode 100644 lib/widgets/data_display/medical/medical_profile_item.dart create mode 100644 lib/widgets/others/StarRating.dart create mode 100644 lib/widgets/others/card_with_bg_widget.dart create mode 100644 lib/widgets/others/rounded_container_widget.dart create mode 100644 lib/widgets/others/sliver_app_bar_delegate.dart diff --git a/assets/images/Icon-awesome-calendar.png b/assets/images/Icon-awesome-calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..f058ca7751708be04ea0caccb087948640534906 GIT binary patch literal 408 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 HDWM4fAch|v literal 0 HcmV?d00001 diff --git a/assets/images/medical/lab_result_icon.png b/assets/images/medical/lab_result_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c9425278f5831ecac7f49e134b2177cb6eb83e3c GIT binary patch literal 1208 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 M07*qoM6N<$f<$z$DgXcg literal 0 HcmV?d00001 diff --git a/assets/images/medical/radiology_icon.png b/assets/images/medical/radiology_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9e760d650364c8792746b380ad7f7597fb328b9c GIT binary patch literal 1491 zcmV;^1uXiBP)Px#IAvH#W=%~1DgXcg2mk?xX#fNO00031000^Q000000-yo_1ONa40RR91C7=TU z1ONa40RR91D*ylh01PmlQ~&@4Nl8ROR9FeMmH&0rRuF{^hyPJ3h^Qb+1%9c3r2>lz zPzM$juvB2V0yY(_r~st`$rX61!1?a(j59n-UU8D#b3V2e`uf2ELE-d z>hBHZvFE-n7=6zV=Id+x0%uh*;fwWY3K)Xty)9k>%^bje#SW6i=qvA`2)%)Pm9%&l zCQI^sb9s^u7$NpsYN>+gAE-6&Qg7?Ux!5z%W(xt77UJs}UmLi7B^jZEkMJ2>-$~xV3z$F`a%m4;)HQgrCTgQL4A$iGcE*NSflIae zLO)(tL6TqxH4JbM@}(YHSS4+~u}N*9jT)=-P+^SVmr}gRhpg6K6LcW;(7`Hc<7AVH zsTA%2)z8`ECCIhK=*^7z#jAWW)Mdz(4xrzOzLp&vAQ|$tv7`%1chDHR*aW@B zinxK#ARSKO^jvc(U!b^yEBO7i{J7bB^VP4-S9lFQXiWthNbm*O|i$?E)&692|}n$H>Wt{`8x#hXCd zfY#+R>iwXON`o#fIDp>9-WZ9RnV^OSRJ&J^cfs3}i*M$&L@9yRC|NUj#HN1iM@D*MdgvYP1P=Pk5F#l|@b#qbKh~nd?F)s#f=xaRc zjTCVxXxWA_fRgqsfMP@H}yDp!(t+8bG=3X6DK|Xlkf|1gli}vO8fXm zQCt2bR5&H*uofgO&_)j+U+9ym?jeD60C^2)O$+Yn&1u~TaYo)1lm_9cw4oM>7F;?+ zJzZw7ydp;F0If^G)Vd99LA@O$a1A8#wQuES9utO!G@Pr%P;Zkp3hKS}{D2SHjLIH% zN`kajYYy_3ep5ZYJ2(yzqqITPCB-$2@CH5_Ux{0ge+4CIt=>ky#{p03^mwJmf_C`T zOmD!ug)gCZN3I`v2fBcy!{vX44qV?!HeOitb9R~kq-<~=p1A)Q+9*K@u0(PGtrJ_2 z3P^_XTnR(-$KG>qYRFe+^;}=xTbrwirR4`=Z~0s(&D7kpU*B1I55Q+hkLr1DPwDxmHg2=AnmQihxgXY9zbD>U?lT@WTYzgMX}vfX zdj@vdkT&qm^QgmWNU(>zAM1v`OMa}~pN+aupLOEKOSvw$)N|kWt!y?Ck6QW{-TMQ{ zr56_e%IdkYm@_kPvbxOt#s6mVxwx>&o7DPO`m@E@zN2{jQ;!Yut<{yq-s0KNGNISK z$tKU$Hh{p$B=Z)iS9Cicvaj0zarGchw{lRN#ugvD!_G-plOe zvZbYid&m_pHqul*rv}q6A1|ueGW1lhQpc1w)TfzK!t?_*^9kOMll*b!TpK>jz2C2>hV tobzI7>L-0|T0jRAxN4FTb}+yy{SCB?2F(eR$hH6g002ovPDHLkV1iQ0&P@OS literal 0 HcmV?d00001 diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index 592ceee8..e8efba11 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index 592ceee8..399e9340 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/lib/main.dart b/lib/main.dart index 2eb5dd26..186ec52f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -53,6 +53,7 @@ class MyApp extends StatelessWidget { hintColor: Colors.grey[400], disabledColor: Colors.grey[300], errorColor: Color.fromRGBO(235, 80, 60, 1.0), + scaffoldBackgroundColor: Colors.grey[100], textSelectionColor: Color.fromRGBO(80, 100, 253, 0.5), textSelectionHandleColor: Color.fromRGBO(80, 100, 253, 1.0), canvasColor: Colors.white, @@ -63,7 +64,7 @@ class MyApp extends StatelessWidget { cursorColor: Color.fromRGBO(78, 62, 253, 1.0), iconTheme: IconThemeData(), appBarTheme: AppBarTheme( - color: Colors.grey, + color: Colors.grey[700], brightness: Brightness.light, elevation: 0.0, actionsIconTheme: IconThemeData( diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index ec9e1524..b92804a5 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -1,4 +1,6 @@ import 'package:diplomaticquarterapp/pages/landing/replay_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/medical_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/my_admissions_page.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/bottom_navigation/bottom_nav_bar.dart'; import 'package:diplomaticquarterapp/widgets/drawer/app_drawer_widget.dart'; @@ -55,7 +57,7 @@ class _LandingPageState extends State { body: PageView( physics: NeverScrollableScrollPhysics(), controller: pageController, - children: [HomePage(), ReplayPage(), Container(), Container()], + children: [HomePage(), ReplayPage(), MedicalPage(), MyAdmissionsPage()], ), bottomNavigationBar: BottomNavBar(changeIndex: _changeCurrentTab), ); diff --git a/lib/pages/medical/medical_page.dart b/lib/pages/medical/medical_page.dart new file mode 100644 index 00000000..049ba0bc --- /dev/null +++ b/lib/pages/medical/medical_page.dart @@ -0,0 +1,132 @@ +import 'dart:math'; + +import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/others/sliver_app_bar_delegate.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class MedicalPage extends StatefulWidget { + @override + _MedicalPageState createState() => _MedicalPageState(); + +} + +class _MedicalPageState extends State { + @override + Widget build(BuildContext context) { + return AppScaffold( + body: CustomScrollView( + physics: BouncingScrollPhysics(), + key: PageStorageKey("medical"), + slivers: [ + SliverPersistentHeader( + delegate: SliverAppBarDelegate( + maxHeight: 200.0, + minHeight: 200.0, + child: Container( + width: double.infinity, + height: 200, + color: Colors.grey, + ), + ), + ), + SliverPersistentHeader( + delegate: SliverAppBarDelegate( + maxHeight: double.maxFinite, + minHeight: double.maxFinite, + child: Padding( + padding: EdgeInsets.symmetric(vertical: 12.0), + child: Column( + children: [ + + Row( + children: [ + Expanded( + flex: 1, + child: MedicalProfileItem( + title: 'My Doctor', + imagePath: 'doctor_icon.png', + subTitle: 'List', + ), + ), + Expanded( + flex: 1, + child: MedicalProfileItem( + title: 'Lab', + imagePath: 'lab_result_icon.png', + subTitle: 'Result', + ), + ) + ], + ), + Row( + children: [ + Expanded( + flex: 1, + child: MedicalProfileItem( + title: 'Radiology', + imagePath: 'radiology_icon.png', + subTitle: 'Service', + ), + ), + Expanded( + flex: 1, + child: MedicalProfileItem( + title: 'Medicines', + imagePath: 'prescription_icon.png', + subTitle: 'Prescriptions', + ), + ) + ], + ), + Row( + children: [ + Expanded( + flex: 1, + child: MedicalProfileItem( + title: 'Insurance', + imagePath: 'insurance_card_icon.png', + subTitle: 'Card', + ), + ), + Expanded( + flex: 1, + child: MedicalProfileItem( + title: 'Insurance', + imagePath: 'insurance_approvals_icon.png', + subTitle: 'Approvals', + ), + ) + ], + ), + Row( + children: [ + Expanded( + flex: 1, + child: MedicalProfileItem( + title: 'Medical', + imagePath: 'medical_history_icon.png', + subTitle: 'Reports', + ), + ), + Expanded( + flex: 1, + child: Container(), + ) + + ], + ), + ], + ), + ), + ), + ), + ], + + ), + ); + } +} + + diff --git a/lib/pages/medical/my_admissions_page.dart b/lib/pages/medical/my_admissions_page.dart new file mode 100644 index 00000000..ff25884e --- /dev/null +++ b/lib/pages/medical/my_admissions_page.dart @@ -0,0 +1,61 @@ +import 'package:diplomaticquarterapp/widgets/data_display/medical/doctor_card.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/cupertino.dart'; + +class MyAdmissionsPage extends StatefulWidget { + @override + _MyAdmissionsPageState createState() => _MyAdmissionsPageState(); +} + +class _MyAdmissionsPageState extends State { + @override + Widget build(BuildContext context) { + return AppScaffold( + body: ListView( + children: [ + AppExpandableNotifier( + title: 'Arryan Hospital', + bodyWidget: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + DoctorCard( + name: 'Dr Mohammad Aljammal', + date: 'Feb 14, 2020', + profileUrl: + 'https://scontent.famm4-1.fna.fbcdn.net/v/t31.0-8/30425660_1862582094040824_7851633779570222226_o.jpg?_nc_cat=101&_nc_sid=09cbfe&_nc_eui2=AeF3TI6D2_tFS5QoQsqyaCKd2zBfzh74hOzbMF_OHviE7PQdLHRwmBoIOiKyWmK9MskOshPjkU73a5EdQMA3dqnV&_nc_ohc=1feou2fDCuIAX_Ra9qB&_nc_ht=scontent.famm4-1.fna&oh=709d34d1c284de1d0aa08ed37b0ac09a&oe=5F3C5ACB', + rat: 3.8, + subName: 'Jammal', + ), + DoctorCard( + name: 'Dr Mohammad Aljammal', + date: 'Feb 14, 2020', + profileUrl: + 'https://scontent.famm4-1.fna.fbcdn.net/v/t31.0-8/30425660_1862582094040824_7851633779570222226_o.jpg?_nc_cat=101&_nc_sid=09cbfe&_nc_eui2=AeF3TI6D2_tFS5QoQsqyaCKd2zBfzh74hOzbMF_OHviE7PQdLHRwmBoIOiKyWmK9MskOshPjkU73a5EdQMA3dqnV&_nc_ohc=1feou2fDCuIAX_Ra9qB&_nc_ht=scontent.famm4-1.fna&oh=709d34d1c284de1d0aa08ed37b0ac09a&oe=5F3C5ACB', + rat: 3.8, + subName: 'Jammal', + ), + ], + ), + ), + + AppExpandableNotifier( + title: 'Arryan Hospital', + bodyWidget: DoctorCard( + onTap: () { + //TODO when we need it + }, + name: 'Dr Mohammad Aljammal', + date: 'Feb 14, 2020', + profileUrl: + 'https://scontent.famm4-1.fna.fbcdn.net/v/t31.0-8/30425660_1862582094040824_7851633779570222226_o.jpg?_nc_cat=101&_nc_sid=09cbfe&_nc_eui2=AeF3TI6D2_tFS5QoQsqyaCKd2zBfzh74hOzbMF_OHviE7PQdLHRwmBoIOiKyWmK9MskOshPjkU73a5EdQMA3dqnV&_nc_ohc=1feou2fDCuIAX_Ra9qB&_nc_ht=scontent.famm4-1.fna&oh=709d34d1c284de1d0aa08ed37b0ac09a&oe=5F3C5ACB', + rat: 4.8, + subName: 'Jammal', + ), + ), + + ], + ), + ); + } +} diff --git a/lib/widgets/avatar/large_avatar.dart b/lib/widgets/avatar/large_avatar.dart index cd6ee539..ed904d03 100644 --- a/lib/widgets/avatar/large_avatar.dart +++ b/lib/widgets/avatar/large_avatar.dart @@ -16,9 +16,9 @@ class LargeAvatar extends StatelessWidget { @required this.name, this.url, this.disableProfileView: false, - this.radius = 60.0, - this.width = 90, - this.height = 90, + this.radius = 70.0, + this.width = 70, + this.height = 60, this.onTap}) : super(key: key); @@ -71,7 +71,7 @@ class LargeAvatar extends StatelessWidget { offset: Offset(0.0, 5.0), blurRadius: 16.0) ], - borderRadius: BorderRadius.all(Radius.circular(50.0)), + borderRadius: BorderRadius.all(Radius.circular(radius)), ), width: width, height: height, diff --git a/lib/widgets/data_display/medical/doctor_card.dart b/lib/widgets/data_display/medical/doctor_card.dart new file mode 100644 index 00000000..e9a94895 --- /dev/null +++ b/lib/widgets/data_display/medical/doctor_card.dart @@ -0,0 +1,99 @@ +import 'package:diplomaticquarterapp/widgets/avatar/large_avatar.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; +import 'package:diplomaticquarterapp/widgets/others/rounded_container_widget.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; + +class DoctorCard extends StatelessWidget { + final String name; + final String subName; + final double rat; + final String date; + final String profileUrl; + final Function onTap; + + DoctorCard( + {this.name, + this.subName, + this.rat, + this.date, + this.profileUrl, + this.onTap}); + + @override + Widget build(BuildContext context) { + return RoundedContainer( + child: InkWell( + onTap: onTap, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + Expanded( + flex: 1, + child: LargeAvatar( + name: name, + url: profileUrl, + ), + ), + Expanded( + flex: 4, + child: Container( + margin: EdgeInsets.all(10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + name, + bold: true, + ), + Texts( + subName, + variant: 'bodyText', + ), + StarRating(totalAverage: rat, forceStars: true), + ], + ), + ), + ), + ], + ), + ), + + Divider( + height: 8, + color: Colors.grey[400], + ), + Padding( + padding: const EdgeInsets.all(5.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + width: 10, + ), + Image.asset( + 'assets/images/Icon-awesome-calendar.png', + width: 30, + height: 30, + ), + Expanded( + child: Texts( + date, + variant: 'bodyText', + ), + ) + ], + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/widgets/data_display/medical/medical_profile_item.dart b/lib/widgets/data_display/medical/medical_profile_item.dart new file mode 100644 index 00000000..6357d830 --- /dev/null +++ b/lib/widgets/data_display/medical/medical_profile_item.dart @@ -0,0 +1,53 @@ +import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:diplomaticquarterapp/widgets/others/rounded_container_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:hexcolor/hexcolor.dart'; + +class MedicalProfileItem extends StatelessWidget { + MedicalProfileItem({ + @required this.imagePath, + @required this.title, + @required this.subTitle, + }); + + final String imagePath; + final String title; + final String subTitle; + + @override + Widget build(BuildContext context) { + return RoundedContainer( + child: Container( + padding: EdgeInsets.all(5), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: TextStyle( + fontSize: 1.7 * SizeConfig.textMultiplier, + color: Hexcolor('#B8382C'), + fontWeight: FontWeight.bold), + ), + RichText( + text: TextSpan( + style: TextStyle(color: Colors.black), + children: [ + TextSpan(text: subTitle), + ], + ), + ), + Align( + alignment: Alignment.bottomRight, + child: Image.asset( + "assets/images/medical/$imagePath", + height: SizeConfig.heightMultiplier * 7, + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/widgets/others/StarRating.dart b/lib/widgets/others/StarRating.dart new file mode 100644 index 00000000..f33ced32 --- /dev/null +++ b/lib/widgets/others/StarRating.dart @@ -0,0 +1,39 @@ +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:eva_icons_flutter/eva_icons_flutter.dart'; +import 'package:flutter/material.dart'; + +class StarRating extends StatelessWidget { + + final double totalAverage; + final double size; + final int totalCount; + final bool forceStars; + + StarRating({Key key, this.totalAverage: 0.0, this.size: 16.0, this.totalCount, this.forceStars = false}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + if (!forceStars && (totalAverage==null || totalAverage==0)) + Texts("New", style: "caption"), + if (forceStars || (totalAverage!=null && totalAverage>0)) + ...List.generate(5, (index) => + Padding( + padding: EdgeInsets.only(right: 1.0), + child: Icon( + (index+1) <= (totalAverage ?? 0) ? EvaIcons.star : EvaIcons.starOutline, + size: size, + color: (index+1) <= (totalAverage ?? 0) ? Color.fromRGBO(255, 186, 0, 1.0) : Theme.of(context).hintColor + ), + ) + ), + if (totalCount!=null) + SizedBox(width: 9.0), + if (totalCount!=null) + Texts("("+totalCount.toString()+")", style: "overline", color: Colors.grey[400],) + ] + ); + } +} \ No newline at end of file diff --git a/lib/widgets/others/app_expandable_notifier.dart b/lib/widgets/others/app_expandable_notifier.dart index fca61f1f..0e2a3c4b 100644 --- a/lib/widgets/others/app_expandable_notifier.dart +++ b/lib/widgets/others/app_expandable_notifier.dart @@ -19,7 +19,7 @@ class AppExpandableNotifier extends StatelessWidget { Widget build(BuildContext context) { return ExpandableNotifier( child: Padding( - padding: const EdgeInsets.all(10), + padding: const EdgeInsets.only(left: 10,right: 10,top: 4), child: Card( clipBehavior: Clip.antiAlias, child: Column( @@ -39,14 +39,14 @@ class AppExpandableNotifier extends StatelessWidget { padding: EdgeInsets.all(10), child: Text( title, - style: TextStyle(fontWeight: FontWeight.bold), + style: TextStyle(fontWeight: FontWeight.bold,fontSize: 22,), ), ), - collapsed: collapsed, + collapsed: collapsed ?? Container(), expanded: bodyWidget, builder: (_, collapsed, expanded) { return Padding( - padding: EdgeInsets.only(left: 10, right: 10, bottom: 10), + padding: EdgeInsets.only(left: 5, right: 5, bottom: 5), child: Expandable( collapsed: collapsed, expanded: expanded, diff --git a/lib/widgets/others/card_with_bg_widget.dart b/lib/widgets/others/card_with_bg_widget.dart new file mode 100644 index 00000000..1b96008a --- /dev/null +++ b/lib/widgets/others/card_with_bg_widget.dart @@ -0,0 +1,71 @@ +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:flutter/material.dart'; +import 'package:hexcolor/hexcolor.dart'; +import 'package:provider/provider.dart'; + +/* + *@author: Mohammad Aljammal + *@Date:27/4/2020 + *@param: Widget + *@return: + *@desc: Card With Bg Widget + */ + +class CardWithBgWidget extends StatelessWidget { + final Widget child; + + CardWithBgWidget({@required this.child}); + + @override + Widget build(BuildContext context) { + ProjectViewModel projectProvider = Provider.of(context); + return Container( + margin: EdgeInsets.symmetric(vertical: 10.0), + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(10.0), + ), + border: Border.all(color: Colors.grey, width: 1.0), + ), + child: Material( + borderRadius: BorderRadius.all(Radius.circular(10.0)), + child: Stack( + children: [ + if (projectProvider.isArabic) + Positioned( + child: Container( + width: 10, + color: Hexcolor('#58434F'), + ), + bottom: 0, + top: 0, + right: 0, + ) + else + Positioned( + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(9.0), + bottomLeft: Radius.circular(9.0), + ),color: Colors.blueAccent, + + ), + width: 15, + + ), + bottom: 0, + top: 0, + left: 0, + ), + Container( + padding: EdgeInsets.all(15.0), + margin: EdgeInsets.only(left: 10), + child: child) + ], + ), + ), + ); + } +} diff --git a/lib/widgets/others/rounded_container_widget.dart b/lib/widgets/others/rounded_container_widget.dart new file mode 100644 index 00000000..58d9a034 --- /dev/null +++ b/lib/widgets/others/rounded_container_widget.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; + +/// DESCRIPTION : Custom widget for rounded container and custom decoration + +class RoundedContainer extends StatefulWidget { + final double width; + final double height; + final double raduis; + final Color backgroundColor; + final double margin; + final double elevation; + final bool showBorder; + final Color borderColor; + final bool customCornerRaduis; + final double topLeft; + final double bottomRight; + final double topRight; + final double bottomLeft; + final Widget child; + final double borderWidth; + + RoundedContainer( + {@required this.child, + this.width, + this.height, + this.raduis = 10, + this.backgroundColor = Colors.white, + this.margin = 10, + this.elevation = 1, + this.showBorder = false, + this.borderColor = Colors.grey, + this.customCornerRaduis = false, + this.topLeft = 0, + this.topRight = 0, + this.bottomRight = 0, + this.bottomLeft = 0, + this.borderWidth = 1}); + + @override + _RoundedContainerState createState() => _RoundedContainerState(); +} + +class _RoundedContainerState extends State { + @override + Widget build(BuildContext context) { + return Container( + width: widget.width, + height: widget.height, + margin: EdgeInsets.all(widget.margin), + decoration: widget.showBorder == true + ? BoxDecoration( + color: Theme.of(context).primaryColor, + border: Border.all( + color: widget.borderColor, width: widget.borderWidth), + borderRadius: widget.customCornerRaduis + ? BorderRadius.only( + topLeft: Radius.circular(widget.topLeft), + topRight: Radius.circular(widget.topRight), + bottomRight: Radius.circular(widget.bottomRight), + bottomLeft: Radius.circular(widget.bottomLeft)) + : BorderRadius.circular(widget.raduis), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.1), + spreadRadius: 10, + blurRadius: 5, + offset: Offset(0, 5), // changes position of shadow + ), + ]) + : null, + child: Card( + margin: EdgeInsets.all(0), + shape: RoundedRectangleBorder( + borderRadius: widget.customCornerRaduis + ? BorderRadius.only( + topLeft: Radius.circular(widget.topLeft), + topRight: Radius.circular(widget.topRight), + bottomRight: Radius.circular(widget.bottomRight), + bottomLeft: Radius.circular(widget.bottomLeft)) + : BorderRadius.circular(widget.raduis), + ), + color: widget.backgroundColor, + child: widget.child, + )); + } +} diff --git a/lib/widgets/others/sliver_app_bar_delegate.dart b/lib/widgets/others/sliver_app_bar_delegate.dart new file mode 100644 index 00000000..49c9b4fd --- /dev/null +++ b/lib/widgets/others/sliver_app_bar_delegate.dart @@ -0,0 +1,34 @@ +import 'dart:math'; + +import 'package:flutter/cupertino.dart'; + +class SliverAppBarDelegate extends SliverPersistentHeaderDelegate { + SliverAppBarDelegate({ + @required this.minHeight, + @required this.maxHeight, + @required this.child, + }); + + final double minHeight; + final double maxHeight; + final Widget child; + + @override + double get minExtent => minHeight; + + @override + double get maxExtent => max(maxHeight, minHeight); + + @override + Widget build( + BuildContext context, + double shrinkOffset, + bool overlapsContent) + { + return new SizedBox.expand(child: child); + } + @override + bool shouldRebuild(SliverAppBarDelegate oldDelegate) { + return false; + } +} \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index 4bb76eaa..426404b8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -84,6 +84,7 @@ flutter: # assets: assets: - assets/images/ + - assets/images/medical/ fonts: - family: WorkSans