flutter_animated_bottom_nav 0.0.2
flutter_animated_bottom_nav: ^0.0.2 copied to clipboard
A highly customizable animated bottom navigation with morphing icons, badge support, and smooth transitions
import 'package:flutter/material.dart';
import 'package:flutter_animated_bottom_nav/flutter_animated_bottom_nav.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Animated Bottom Nav Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
useMaterial3: true,
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _selectedIndex = 0;
final List<NavItem> _navItems = [
NavItemExtension.home(
badgeCount: 3,
badgeStyle: const BadgeStyle(
backgroundColor: Colors.red,
textColor: Colors.white,
),
),
NavItemExtension.search(),
NavItemExtension.notifications(
badgeCount: 12,
badgeStyle: const BadgeStyle(
backgroundColor: Colors.orange,
textColor: Colors.white,
showZero: true,
),
),
NavItemExtension.profile(),
NavItemExtension.settings(),
];
final List<Widget> _pages = [
const HomePage(),
const SearchPage(),
const NotificationsPage(),
const ProfilePage(),
const SettingsPage(),
];
@override
Widget build(BuildContext context) {
return Scaffold(
body: IndexedStack(
index: _selectedIndex,
children: _pages,
),
bottomNavigationBar: AnimatedBottomNav(
items: _navItems,
selectedIndex: _selectedIndex,
onItemSelected: (index) {
setState(() {
_selectedIndex = index;
});
},
style: const NavStyle(
backgroundColor: Colors.white,
selectedColor: Colors.blue,
unselectedColor: Colors.grey,
selectedItemBackgroundColor: Color(0xFFE3F2FD),
height: 80,
elevation: 8,
animationDuration: Duration(milliseconds: 300),
animationCurve: Curves.easeInOut,
),
),
);
}
}
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.blue.shade50,
appBar: AppBar(
title: const Text('Home'),
backgroundColor: Colors.blue,
foregroundColor: Colors.white,
),
body: const Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.home,
size: 100,
color: Colors.blue,
),
SizedBox(height: 20),
Text(
'Home Page',
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: Colors.blue,
),
),
SizedBox(height: 10),
Text(
'This is the home page with a badge count of 3',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 16,
color: Colors.grey,
),
),
],
),
),
);
}
}
class SearchPage extends StatelessWidget {
const SearchPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.green.shade50,
appBar: AppBar(
title: const Text('Search'),
backgroundColor: Colors.green,
foregroundColor: Colors.white,
),
body: const Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.search,
size: 100,
color: Colors.green,
),
SizedBox(height: 20),
Text(
'Search Page',
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: Colors.green,
),
),
SizedBox(height: 10),
Text(
'Search for anything you want',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 16,
color: Colors.grey,
),
),
],
),
),
);
}
}
class NotificationsPage extends StatelessWidget {
const NotificationsPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.orange.shade50,
appBar: AppBar(
title: const Text('Notifications'),
backgroundColor: Colors.orange,
foregroundColor: Colors.white,
),
body: const Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.notifications,
size: 100,
color: Colors.orange,
),
SizedBox(height: 20),
Text(
'Notifications Page',
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: Colors.orange,
),
),
SizedBox(height: 10),
Text(
'You have 12 new notifications',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 16,
color: Colors.grey,
),
),
],
),
),
);
}
}
class ProfilePage extends StatelessWidget {
const ProfilePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.purple.shade50,
appBar: AppBar(
title: const Text('Profile'),
backgroundColor: Colors.purple,
foregroundColor: Colors.white,
),
body: const Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.person,
size: 100,
color: Colors.purple,
),
SizedBox(height: 20),
Text(
'Profile Page',
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: Colors.purple,
),
),
SizedBox(height: 10),
Text(
'Manage your profile settings',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 16,
color: Colors.grey,
),
),
],
),
),
);
}
}
class SettingsPage extends StatelessWidget {
const SettingsPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.grey.shade50,
appBar: AppBar(
title: const Text('Settings'),
backgroundColor: Colors.grey,
foregroundColor: Colors.white,
),
body: const Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.settings,
size: 100,
color: Colors.grey,
),
SizedBox(height: 20),
Text(
'Settings Page',
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: Colors.grey,
),
),
SizedBox(height: 10),
Text(
'Configure your app settings',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 16,
color: Colors.grey,
),
),
],
),
),
);
}
}