Merge branch 'dev_sultan'
						commit
						cd61d08d49
					
				| @ -0,0 +1,43 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:hmg_patient_app_new/presentation/home/landing_page.dart'; | ||||
| import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart'; | ||||
| import 'package:hmg_patient_app_new/widgets/bottom_navigation/bottom_navigation.dart'; | ||||
| 
 | ||||
| class LandingNavigation extends StatefulWidget { | ||||
|   const LandingNavigation({super.key}); | ||||
| 
 | ||||
|   @override | ||||
|   State<LandingNavigation> createState() => _LandingNavigationState(); | ||||
| } | ||||
| 
 | ||||
| class _LandingNavigationState extends State<LandingNavigation> { | ||||
|   int _currentIndex = 0; | ||||
|   final PageController _pageController = PageController(); | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Scaffold( | ||||
|       body: PageView( | ||||
|         controller: _pageController, | ||||
|         physics: const NeverScrollableScrollPhysics(), | ||||
|         children: const [ | ||||
|           LandingPage(), | ||||
|           MedicalFilePage(), | ||||
|           LandingPage(), | ||||
|           LandingPage(), | ||||
|           LandingPage(), | ||||
|         ], | ||||
|       ), | ||||
|       bottomNavigationBar: BottomNavigation( | ||||
|         currentIndex: _currentIndex, | ||||
|         onTap: (index) { | ||||
|           setState(() => _currentIndex = index); | ||||
|           _pageController.animateToPage( | ||||
|               index, | ||||
|               duration: const Duration(milliseconds: 300), | ||||
|           curve: Curves.easeInOut); | ||||
|         }, | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @ -1,59 +1,103 @@ | ||||
| import 'package:easy_localization/easy_localization.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:hmg_patient_app_new/core/app_assets.dart'; | ||||
| import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; | ||||
| import 'package:hmg_patient_app_new/core/utils/utils.dart'; | ||||
| import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; | ||||
| import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; | ||||
| import 'package:hmg_patient_app_new/theme/colors.dart'; | ||||
| 
 | ||||
| class BottomNavigation extends StatelessWidget { | ||||
|   const BottomNavigation({super.key}); | ||||
|   final int currentIndex; | ||||
|   final ValueChanged<int> onTap; | ||||
| 
 | ||||
|   const BottomNavigation({ | ||||
|     super.key, | ||||
|     required this.currentIndex, | ||||
|     required this.onTap, | ||||
|   }); | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Container( | ||||
|       padding: const EdgeInsets.symmetric(vertical: 12), | ||||
|       decoration: const BoxDecoration( | ||||
|         color: Colors.white, | ||||
|         border: Border( | ||||
|           top: BorderSide(color: AppColors.bottomNAVBorder, width: 0.5), | ||||
|         ), | ||||
| 
 | ||||
|     final items = [ | ||||
|       BottomNavItem(icon: AppAssets.homeBottom, label: LocaleKeys.home.tr()), | ||||
|       BottomNavItem(icon: AppAssets.myFilesBottom, label: LocaleKeys.myFiles.tr()), | ||||
|       BottomNavItem( | ||||
|         icon: AppAssets.bookAppoBottom, | ||||
|         label: LocaleKeys.appointment.tr(), | ||||
|         iconSize: 27, | ||||
|         isSpecial: true, | ||||
|       ), | ||||
|       BottomNavItem(icon: AppAssets.toDoBottom, label: LocaleKeys.todoList.tr()), | ||||
|       BottomNavItem(icon: AppAssets.servicesBottom, label: LocaleKeys.services2.tr()), | ||||
|     ]; | ||||
| 
 | ||||
|     return Container( | ||||
|       decoration: _containerDecoration, | ||||
|       padding: _containerPadding, | ||||
|       child: Row( | ||||
|         mainAxisAlignment: MainAxisAlignment.spaceAround, | ||||
|         children: [ | ||||
|           _buildNavItem(AppAssets.homeBottom, LocaleKeys.home.tr()), | ||||
|           _buildNavItem(AppAssets.myFilesBottom,  LocaleKeys.myFiles.tr()), | ||||
|           _buildNavItem(AppAssets.bookAppoBottom,  LocaleKeys.appointment.tr(), iconSize: 32), | ||||
|           _buildNavItem(AppAssets.toDoBottom,  LocaleKeys.todoList.tr()), | ||||
|           _buildNavItem(AppAssets.servicesBottom, LocaleKeys.services2.tr()), | ||||
|         ], | ||||
|         children: List.generate( | ||||
|           items.length, | ||||
|               (index) => _buildNavItem(items[index], index), | ||||
|         ), | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   Widget _buildNavItem(String iconName, String label,{ double iconSize = 24}) { | ||||
|     return Column( | ||||
|       mainAxisSize: MainAxisSize.min, | ||||
|       children: [ | ||||
|         Container( | ||||
|           padding: const EdgeInsets.all(10), | ||||
|           child: Utils.buildSvgWithAssets( | ||||
|             icon: iconName, | ||||
|             height: iconSize, | ||||
|             width: iconSize | ||||
|           ), | ||||
|         ), | ||||
|         // const SizedBox(height: 4), | ||||
|         Text( | ||||
|           label, | ||||
|           style: TextStyle( | ||||
|             fontSize: 13, | ||||
|             fontWeight: FontWeight.w500, | ||||
|             color: Colors.black87, | ||||
|   Widget _buildNavItem(BottomNavItem item, int index) { | ||||
|     final bool isSelected = currentIndex == index; | ||||
| 
 | ||||
|     return GestureDetector( | ||||
|       onTap: () => onTap(index), | ||||
|       behavior: HitTestBehavior.opaque, | ||||
|       child: Column( | ||||
|         mainAxisSize: MainAxisSize.min, | ||||
|         children: [ | ||||
|          Center( | ||||
|               child: Utils.buildSvgWithAssets( | ||||
|                 icon: item.icon, | ||||
|                 height: item.iconSize.h, | ||||
|                 width: item.iconSize.h, | ||||
|                  // iconColor:  isSelected ? Colors.black87 : Colors.black87, | ||||
|               ), | ||||
|             ), | ||||
|           const SizedBox(height: 10), | ||||
|           item.label.toText12( | ||||
|             fontWeight:FontWeight.w500, | ||||
|             // color:  Colors.black87, | ||||
|             // textAlign: TextAlign.center, | ||||
|           ), | ||||
|         ), | ||||
|       ], | ||||
|         SizedBox(height:    item.isSpecial ? 5:0 ) | ||||
|         ], | ||||
| 
 | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| class BottomNavItem { | ||||
|   final String icon; | ||||
|   final String label; | ||||
|   final double iconSize; | ||||
|   final bool isSpecial; | ||||
| 
 | ||||
|   const BottomNavItem({ | ||||
|     required this.icon, | ||||
|     required this.label, | ||||
|     this.iconSize = 21, | ||||
|     this.isSpecial = false, | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| // Constants | ||||
| const EdgeInsets _containerPadding = EdgeInsets.all(15); | ||||
| const BoxDecoration _containerDecoration = BoxDecoration( | ||||
|   color: Colors.white, | ||||
|   border: Border( | ||||
|     top: BorderSide( | ||||
|       color: AppColors.bottomNAVBorder, | ||||
|       width: 0.5, | ||||
|     ), | ||||
|   ), | ||||
| ); | ||||
|  | ||||
					Loading…
					
					
				
		Reference in New Issue
	
	 Haroon Amjad
						Haroon Amjad