// ignore_for_file: deprecated_member_use import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:lba/gen/assets.gen.dart'; import 'package:lba/res/colors.dart'; import 'package:lba/screens/mains/discover/discover.dart'; import 'package:lba/screens/mains/hunt/hunt.dart'; import 'package:lba/screens/mains/nearby/mainNearby/nearby.dart'; import 'package:lba/screens/mains/planner/planner.dart'; import 'package:lba/screens/mains/profile/profile.dart'; class MainScreen extends StatefulWidget { const MainScreen({super.key}); @override State createState() => _MainScreenState(); } class _MainScreenState extends State { int _currentIndex = 0; final List _screens = [ const Nearby(), const Discover(), const Hunt(), const Planner(), const Profile(), ]; @override Widget build(BuildContext context) { return Scaffold( extendBody: true, body: AnimatedSwitcher( duration: const Duration(milliseconds: 400), transitionBuilder: (Widget child, Animation animation) { final bool isGoingForward = (child.key as ValueKey).value > _currentIndex; final slideAnimation = Tween( begin: Offset(isGoingForward ? 1.0 : -1.0, 0.0), end: Offset.zero, ).animate( CurvedAnimation( parent: animation, curve: Curves.easeInOutCubic, ), ); return SlideTransition( position: slideAnimation, child: FadeTransition( opacity: animation, child: child, ), ); }, child: KeyedSubtree( key: ValueKey(_currentIndex), child: _screens[_currentIndex], ), ), bottomNavigationBar: CustomBottomNavigationBar( onTap: (int index) { setState(() { _currentIndex = index; }); }, currentIndex: _currentIndex, ), ); } } class CustomBottomNavigationBar extends StatefulWidget { final Function(int) onTap; final int currentIndex; const CustomBottomNavigationBar({ super.key, required this.onTap, required this.currentIndex, }); @override State createState() => _CustomBottomNavigationBarState(); } class _CustomBottomNavigationBarState extends State with SingleTickerProviderStateMixin { final List<_NavItem> items = [ _NavItem('Nearby', Assets.icons.nearby.path, Assets.icons.nearby2.path), _NavItem('Discover', Assets.icons.receiptDiscount.path, Assets.icons.receiptDiscount2.path), _NavItem('Hunt', Assets.icons.game.path, Assets.icons.game2.path), _NavItem('Planner', Assets.icons.calendarTick.path, Assets.icons.calendarTick2.path), _NavItem('Profile', Assets.icons.profile.path, Assets.icons.profile2.path), ]; @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16), child: Container( height: 70, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(12), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.15), blurRadius: 20, offset: const Offset(0, 10), ), ], ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: List.generate(items.length, (index) { final item = items[index]; final bool isSelected = index == widget.currentIndex; return GestureDetector( onTap: () => widget.onTap(index), child: AnimatedContainer( duration: const Duration(milliseconds: 300), curve: Curves.easeOutQuint, padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), decoration: BoxDecoration( color: isSelected ? const Color(0xFFE3F2FD) : Colors.transparent, borderRadius: BorderRadius.circular(15), ), child: Row( children: [ AnimatedSwitcher( duration: const Duration(milliseconds: 300), child: SvgPicture.asset( isSelected ? item.selectedIconPath : item.iconPath, key: ValueKey(isSelected), width: 24, height: 24, ), ), AnimatedSize( duration: const Duration(milliseconds: 300), curve: Curves.easeOut, child: isSelected ? Row( children: [ const SizedBox(width: 8), Text( item.label, style: const TextStyle( color: LightAppColors.primary, fontWeight: FontWeight.w600, ), ), ], ) : const SizedBox(), ), ], ), ), ); }), ), ), ); } } class _NavItem { final String label; final String iconPath; final String selectedIconPath; _NavItem(this.label, this.iconPath, this.selectedIconPath); }