Flutter Fancy Bottom NavigationÂ
Fancy Flutter Bottom Navigation Bar library is very easy to use and nice animations, library is easy to customize as per need.
Use this package as a library
1. Depend on it
Add this to your package’s pubspec.yaml file:
dependencies: fancy_bottom_navigation: ^0.3.2
2. Install it
You can install packages from the command line:
with Flutter:
$ flutter pub get
Alternatively, your editor might support flutter pub get. Check the docs for your editor to learn more.
3. Import it
Now in your Dart code, you can use:
import 'package:fancy_bottom_navigation/fancy_bottom_navigation.dart';
Getting Started
Add the plugin (pub coming soon):

Limitations
For now this is limited to more than 1 tab, and less than 5. So 2-4 tabs.
Basic Usage
Adding the widget
bottomNavigationBar: FancyBottomNavigation(
tabs: [
TabData(iconData: Icons.home, title: "Home"),
TabData(iconData: Icons.search, title: "Search"),
TabData(iconData: Icons.shopping_cart, title: "Basket")
],
onTabChangedListener: (position) {
setState(() {
currentPage = position;
});
},
)
TabData
iconData -> Icon to be used for the tab title -> String to be used for the tab onClick -> Optional function to be used when the circle itself is clicked, on an active tab
Attributes
required
tabs -> List of TabData objects<br/> onTabChangedListener -> Function to handle a tap on a tab, receives int position
optional
initialSelection -> Defaults to 0<br/> circleColor -> Defaults to null, derives from Theme<br/> activeIconColor -> Defaults to null, derives from Theme<br/> inactiveIconColor -> Defaults to null, derives from Theme<br/> taxtColor -> Defaults to null, derives from Theme<br/> barBackgroundColor -> Defaults to null, derives from Theme<br/> key -> Defaults to null<br/>
Theming
The bar will attempt to use your current theme out of the box, however you may want to theme it. Here are the attributes:

Example of Implementation
import 'package:example/second_page.dart';
import 'package:fancy_bottom_navigation/fancy_bottom_navigation.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.deepOrange,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int currentPage = 0;
GlobalKey bottomNavigationKey = GlobalKey();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Fancy Bottom Navigation"),
),
body: Container(
decoration: BoxDecoration(color: Colors.white),
child: Center(
child: _getPage(currentPage),
),
),
bottomNavigationBar: FancyBottomNavigation(
tabs: [
TabData(
iconData: Icons.home,
title: "Home",
onclick: () {
final FancyBottomNavigationState fState =
bottomNavigationKey.currentState;
fState.setPage(2);
}),
TabData(
iconData: Icons.search,
title: "Search",
onclick: () => Navigator.of(context)
.push(MaterialPageRoute(builder: (context) => SecondPage()))),
TabData(iconData: Icons.shopping_cart, title: "Basket")
],
initialSelection: 1,
key: bottomNavigationKey,
onTabChangedListener: (position) {
setState(() {
currentPage = position;
});
},
),
drawer: Drawer(
child: ListView(
children: <Widget>[Text("Hello"), Text("World")],
),
),
);
}
_getPage(int page) {
switch (page) {
case 0:
return Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text("This is the home page"),
RaisedButton(
child: Text(
"Start new page",
style: TextStyle(color: Colors.white),
),
color: Theme.of(context).primaryColor,
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => SecondPage()));
},
),
RaisedButton(
child: Text(
"Change to page 3",
style: TextStyle(color: Colors.white),
),
color: Theme.of(context).accentColor,
onPressed: () {
final FancyBottomNavigationState fState =
bottomNavigationKey.currentState;
fState.setPage(2);
},
)
],
);
case 1:
return Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text("This is the search page"),
RaisedButton(
child: Text(
"Start new page",
style: TextStyle(color: Colors.white),
),
color: Theme.of(context).primaryColor,
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => SecondPage()));
},
)
],
);
default:
return Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text("This is the basket page"),
RaisedButton(
child: Text(
"Start new page",
style: TextStyle(color: Colors.white),
),
color: Theme.of(context).primaryColor,
onPressed: () {},
)
],
);
}
}
}Pub Dev Link
Github Link