Persistent Bottom Navigation Bar

Overview

Persistent Bottom Navigation Bar

pub package version license github stars

A persistent/static bottom navigation bar for Flutter.

NOTE: Those migrating from pre 2.0.0 version should check the latest Readme and instructions as there are many breaking changes introduced in the 2.0.0 update

Persistent Behavior

Styles

Style15 Style16
style1 style10
Style1 Style9
style1 style10
Style7 Style10
style3 style5
Style12 Style13
style6 style8
Style3 Style6
style6 style8
Neumorphic Neumorphic without subtitle
neumorphic1 neumorphic2

Note: These do not include all style variations

Features

  • Highly customizable persistent bottom navigation bar.
  • Ability to push new screens with or without bottom navigation bar.
  • 20 styles for the bottom navigation bar.
  • Includes functions for pushing screen with or without the bottom navigation bar i.e. pushNewScreen() and pushNewScreenWithRouteSettings().
  • Based on flutter's Cupertino(iOS) bottom navigation bar.
  • Can be translucent for a particular tab.
  • Custom styling for the navigation bar. Click here for more information.
  • Handles hardware/software Android back button.

Getting Started

In your flutter project add the dependency:

dependencies:
  persistent_bottom_nav_bar: any

Import the package:

import 'package:persistent_bottom_nav_bar/persistent-tab-view.dart';

Persistent bottom navigation bar uses PersistentTabController as its controller. Here is how to declare it:

PersistentTabController _controller;

_controller = PersistentTabController(initialIndex: 0);

The main widget then to be declared is PersistentTabView. NOTE: This widget includes SCAFFOLD (based on CupertinoTabScaffold), so no need to declare it. Following is an example for demonstration purposes:

class MyApp extends StatelessWidget {
  const MyApp({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return PersistentTabView(
        context,
        controller: _controller,
        screens: _buildScreens(),
        items: _navBarsItems(),
        confineInSafeArea: true,
        backgroundColor: Colors.white, // Default is Colors.white.
        handleAndroidBackButtonPress: true, // Default is true.
        resizeToAvoidBottomInset: true, // This needs to be true if you want to move up the screen when keyboard appears. Default is true.
        stateManagement: true, // Default is true.
        hideNavigationBarWhenKeyboardShows: true, // Recommended to set 'resizeToAvoidBottomInset' as true while using this argument. Default is true.
        decoration: NavBarDecoration(
          borderRadius: BorderRadius.circular(10.0),
          colorBehindNavBar: Colors.white,
        ),
        popAllScreensOnTapOfSelectedTab: true,
        popActionScreens: PopActionScreensType.all,
        itemAnimationProperties: ItemAnimationProperties( // Navigation Bar's items animation properties.
          duration: Duration(milliseconds: 200),
          curve: Curves.ease,
        ),
        screenTransitionAnimation: ScreenTransitionAnimation( // Screen transition animation on change of selected tab.
          animateTabTransition: true,
          curve: Curves.ease,
          duration: Duration(milliseconds: 200),
        ),
        navBarStyle: NavBarStyle.style1, // Choose the nav bar style with this property.
    );
  }
}
    List<Widget> _buildScreens() {
        return [
          MainScreen(),
          SettingsScreen()
        ];
    }
    List<PersistentBottomNavBarItem> _navBarsItems() {
        return [
            PersistentBottomNavBarItem(
                icon: Icon(CupertinoIcons.home),
                title: ("Home"),
                activeColorPrimary: CupertinoColors.activeBlue,
                inactiveColorPrimary: CupertinoColors.systemGrey,
            ),
            PersistentBottomNavBarItem(
                icon: Icon(CupertinoIcons.settings),
                title: ("Settings"),
                activeColorPrimary: CupertinoColors.activeBlue,
                inactiveColorPrimary: CupertinoColors.systemGrey,
            ),
        ];
    }

Navigator Functions

Note: You still can use regular Navigator functions like 'pushNamed' but be sure to check the argument routeAndNavigatorSettings your PersistentBottomNavBarItem for route settings and some other navigator related properties To push a new screen, use the following functions to control the visibility of bottom navigation bar on a particular screen. You can use your own logic to implement platform-specific behavior. One of the solutions could be to use the property withNavBar and toggle it according to the Platform.

In platform-specific behavior, while pushing a new screen, on Android it will push the screen WITHOUT the bottom navigation bar but on iOS it will persist the bottom navigation bar. This is the default behavior specified by each platform.

    pushNewScreen(
        context,
        screen: MainScreen(),
        withNavBar: true, // OPTIONAL VALUE. True by default.
        pageTransitionAnimation: PageTransitionAnimation.cupertino,
    );
    pushNewScreenWithRouteSettings(
        context,
        settings: RouteSettings(name: MainScreen.routeName),
        screen: MainScreen(),
        withNavBar: true,
        pageTransitionAnimation: PageTransitionAnimation.cupertino,
    );

If you are pushing a new modal screen, use the following function:

    pushDynamicScreen(
        context,
        screen: HomeModalScreen(),
        withNavBar: true,
    );

Some Useful Tips

  • Pop to any screen in the navigation graph for a given tab:

        Navigator.of(context).popUntil((route) {
            return route.settings.name == "ScreenToPopBackTo";
        });
  • Pop back to first screen in the navigation graph for a given tab:

        Navigator.of(context).popUntil(ModalRoute.withName("/"));
        Navigator.of(context).pushAndRemoveUntil(
          CupertinoPageRoute(
            builder: (BuildContext context) {
              return FirstScreen();
            },
          ),
          (_) => false,
        );
  • To push bottom sheet on top of the Navigation Bar, use showModalBottomScreen and set it's property useRootNavigator to true. See example project for an illustration.

Custom Navigation Bar Styling

If you want to have your own style for the navigation bar, follow these steps:

  1. Declare your custom widget. Please keep in mind that you will have to handle the function onSelectedItem and the integer selectedIndex yourself to maintain full functionality. Also please note that you can define your own model for the navigation bar item instead of the provided PersistentBottomNavBarItem. See this example below for better understanding:

        class CustomNavBarWidget extends StatelessWidget {
            final int selectedIndex;
            final List<PersistentBottomNavBarItem> items; // NOTE: You CAN declare your own model here instead of `PersistentBottomNavBarItem`.
            final ValueChanged<int> onItemSelected;
    
            CustomNavBarWidget(
                {Key key,
                this.selectedIndex,
                @required this.items,
                this.onItemSelected,});
    
            Widget _buildItem(
                PersistentBottomNavBarItem item, bool isSelected) {
                return Container(
                alignment: Alignment.center,
                height: 60.0,
                child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    mainAxisSize: MainAxisSize.min,
                    children: <Widget>[
                    Flexible(
                        child: IconTheme(
                        data: IconThemeData(
                            size: 26.0,
                            color: isSelected
                                ? (item.activeColorSecondary == null
                                    ? item.activeColorPrimary
                                    : item.activeColorSecondary)
                                : item.inactiveColorPrimary == null
                                    ? item.activeColorPrimary
                                    : item.inactiveColorPrimary),
                        child: item.icon,
                        ),
                    ),
                    Padding(
                        padding: const EdgeInsets.only(top: 5.0),
                        child: Material(
                        type: MaterialType.transparency,
                        child: FittedBox(
                            child: Text(
                            item.title,
                            style: TextStyle(
                                color: isSelected
                                    ? (item.activeColorSecondary == null
                                        ? item.activeColorPrimary
                                        : item.activeColorSecondary)
                                    : item.inactiveColorPrimary,
                                fontWeight: FontWeight.w400,
                                fontSize: 12.0),
                        )),
                        ),
                    )
                    ],
                ),
                );
            }
    
            @override
            Widget build(BuildContext context) {
                return Container(
                color: Colors.white,
                child: Container(
                    width: double.infinity,
                    height: 60.0,
                    child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceAround,
                    children: items.map((item) {
                        int index = items.indexOf(item);
                        return Flexible(
                        child: GestureDetector(
                            onTap: () {
                            this.onItemSelected(index);
                            },
                            child: _buildItem(
                                item, selectedIndex == index),
                        ),
                        );
                    }).toList(),
                    ),
                ),
                );
            }
        }
    
  2. In the main PersistentTabView widget, set the navBarStyle property as NavBarStyle.custom and pass on the custom widget you just created in the customWidget property like this:

    class MyApp extends StatelessWidget {
        const MyApp({Key key}) : super(key: key);
    
        @override
        Widget build(BuildContext context) {
            return PersistentTabView.custom(
                context,
                controller: _controller,
                itemCount: items.length, // This is required in case of custom style! Pass the number of items for the nav bar.
                screens: _buildScreens(),
                confineInSafeArea: true,
                handleAndroidBackButtonPress: true,
                onItemSelected: (int) {
                    setState(() {}); // This is required to update the nav bar if Android back button is pressed
                },
                customWidget: CustomNavBarWidget( // Your custom widget goes here
                    items: _navBarsItems(),
                    selectedIndex: _controller.index,
                    onItemSelected: (index) {
                        setState(() {
                            _controller.index = index; // NOTE: THIS IS CRITICAL!! Don't miss it!
                        });
                    },
                ),
            );
        }
    }
    

    NOTE: In the 'onSelected' function of the customWidget, don't forgot to change the index of the controller

  3. Done! As we can see, some of the other properties like iconSize, items are not required here so you can skip those properties. To control the bottom padding of the screen, use bottomScreenPadding. If you give too much bottomScreenPadding but less height in the custom widget or vice versa, layout issues might appear.

For better understanding, refer to the example project in the official git repo.

Comments
  • Navbar and keyboard

    Navbar and keyboard

    Hi!

    Using the following settings, the navbar isn't being hidden when the keyboard appears

    return Scaffold(
          body: PersistentTabView(
            controller: _controller,
            screens: _InitialWidgetState._pages
                .map((e) => SafeArea(child: e.value1))
                .toList(),
            items: _InitialWidgetState._pages
                .map((e) => PersistentBottomNavBarItem(
                      icon: e.value2,
                      title: e.value3,
                      inactiveColor: Colors.black,
                      titleFontSize: Theme.of(context).textTheme.bodyText2.fontSize,
                    ))
                .toList(),
            popAllScreensOnTapOfSelectedTab: false,
            navBarHeight: 65,
            navBarStyle: NavBarStyle.style13,
            decoration: NavBarDecoration(
              borderRadius: BorderRadius.circular(15),
              boxShadow: const [BoxShadow()],
            ),
          ),
          
        );
    
    opened by fernando-s97 24
  • How to handle android back button

    How to handle android back button

    Hi,

    Can you please provide your input on how can we handle the hardware back button when the view is pushed.

    Right now when tapping the hardware back button closes the app.

    Thanks.

    opened by elango 14
  • popAllScreensForTheSelectedTab lost with custom style

    popAllScreensForTheSelectedTab lost with custom style

    Hey,

    if a custom style is used, the ability to use "popAllScreensForTheSelectedTab" is lost. How can I use "popAllScreensForTheSelectedTab" in conjunction with custom styles?

    PersistentTabView(
            onItemSelected: (int) {
              setState(
                () {},
              ); 
            },
            customWidget: CustomNavBarWidget(
              items: _navBarsItems(),
              popScreensOnTapOfSelectedTab: true,
              selectedIndex: _controller.index,
              onItemSelected: (index) {
                setState(
                  () {
                    _controller.index = index;
                  },
                );
              },
              decoration: NavBarDecoration(
                borderRadius: BorderRadius.circular(0),
              ),
            ),
            controller: _controller,
            screens: _buildScreens(),
            items: _navBarsItems(),
            itemCount: _navBarsItems().length,
            confineInSafeArea: true,
            backgroundColor: LLColors.background,
            handleAndroidBackButtonPress: true,
            resizeToAvoidBottomInset: true,
            stateManagement: true,
            hideNavigationBarWhenKeyboardShows: true,
            popAllScreensOnTapOfSelectedTab: true,
            itemAnimationProperties: ItemAnimationProperties(
              duration: Duration(milliseconds: 200),
              curve: Curves.easeInOut,
            ),
            screenTransitionAnimation: ScreenTransitionAnimation(
              animateTabTransition: false,
              duration: Duration(milliseconds: 200),
            ),
            navBarStyle: NavBarStyle.custom,
          ),
    
    opened by pascalfriedrich 11
  • Exception when using custom navBar on items is null even when passing itemCount

    Exception when using custom navBar on items is null even when passing itemCount

    Im' currently facing the issue that the following line is throwing an exception that items is null:

    assert(assertMidButtonStyles(navBarStyle, items.length),

    Even when I pass the following parameter:

    itemCount: items.length, // This is required in case of custom style! Pass the number of items for the nav bar.

    It seems there is a simple condition missing

    opened by Yetispapa 11
  • Support for inactive icon when tab is not selected

    Support for inactive icon when tab is not selected

    I noticed that there isn't support for an inactive icon for when a tab is inactive and I think it would be useful since there are versions of Icons for example in the "material" library which are basically the same icon but they have two versions, such as:

    • Icons.assessment
    • Icons.assessment_outlined

    and this is the same for CupertinoIcons (although naming conventions are different):

    • CupertinoIcons.arrow_up_doc_fill
    • CupertinoIcons.arrow_up_doc

    This is the only thing that I really missed from the library, otherwise I can say I'm really happy with the package

    opened by Btrc4t 10
  • How to return to the initial screen using the item in the navigation bar ?

    How to return to the initial screen using the item in the navigation bar ?

    Hi, Thx for this package, it's awesome ! I have a problem, i would like return to the initial screen when i press to the item in the navigation bar. How i do that ? Thx for reply. Simulator Screen Shot - iPhone 11 Pro Max - 2020-05-27 at 22 35 29

    opened by felixferr 10
  • Is there any option to set for the tab I don't want to keep its state?

    Is there any option to set for the tab I don't want to keep its state?

    I have 5 persistent tabs 1 of them is favorite tab when I click on it and user is loged in it shows the favorites but then I go to another tab and logedout and come back to the favorite tab and favorites are still there how to solve this?

    opened by Add00w 8
  • PersistentBottomNavBarItem icon properties don't support for another widget

    PersistentBottomNavBarItem icon properties don't support for another widget

    Dear Bilal , The first , thank for your library . It's great library . But it will perfect if don't have two problem when implementation your library

    1. use another widget in PersistentBottomNavBarItem (Image.asset , ImageIcon , Container) ... They will scale down and very small .
    List<PersistentBottomNavBarItem> _navBarsItems() {
        return [
          PersistentBottomNavBarItem(
            icon: Image.asset('ic_home.png'),
            title: ("Home"),
            activeColor: Colors.deepOrangeAccent,
            inactiveColor: Colors.grey,
            isTranslucent: false,
          ),
          PersistentBottomNavBarItem(
            icon: Icon(CustomIcon.ic_giftcode),
            title: ("Giftcode"),
            activeColor: Colors.deepOrangeAccent,
            inactiveColor: Colors.grey,
            isTranslucent: false,
          ),
          PersistentBottomNavBarItem(
            icon: Icon(CustomIcon.ic_notice),
            title: ("Thông báo"),
            activeColor: Colors.deepOrangeAccent,
            inactiveColor: Colors.grey,
            isTranslucent: false,
          ),
          PersistentBottomNavBarItem(
            icon: Icon(CustomIcon.ic_category),
            title: ("Danh mục"),
            activeColor: Colors.deepOrangeAccent,
            inactiveColor: Colors.grey,
            isTranslucent: false,
          ),
        ];
      }
    

    The result . Screen Shot 2020-06-04 at 4 16 11 PM

    1. Don't support switch icon active and inactive from asset for your library . You know IconData only support Monochrome .

    It will flexiable when use have exist . I hope you fix that problem . Again , Thank you so much .

    opened by khaitq7 8
  • Quick and dirty null-safety

    Quick and dirty null-safety

    This is strictly using the null-safety migration tool and then manually fixing any errors that occur.

    This is better than not being allowed to use this package due to it not supporting null-safety

    opened by DanMossa 7
  • NavBarStyle.style1 error

    NavBarStyle.style1 error

    Exception has occurred. NoSuchMethodError (NoSuchMethodError: The method 'map' was called on null. Receiver: null Tried calling: map<Flexible>(Closure: (PersistentBottomNavBarItem) => Flexible))

    opened by vuthasothea 7
  • Use RouteObserver with PersistentBottomNavBar

    Use RouteObserver with PersistentBottomNavBar

    we're using your great plugin for implementing a consistent tabbar in our app. Now we notice that RouteObserver, which we really rely on, is not working anymore. The problem, as it seems, comes from the different navigators which are created for each tab in the PersistentBottomNavBar. From a quick dive into your code, I actually found a parameter from the used CustomTabView-Widget. So maybe its not a big deal for you.

    class CustomTabView extends StatefulWidget {
      const CustomTabView({
        Key key,
        this.builder,
        this.navigatorKey,
        this.defaultTitle,
        this.routes,
        this.onGenerateRoute,
        this.onUnknownRoute,
        this.routeName,
        **this.navigatorObservers = const <NavigatorObserver>[],**
    ....
    

    Is it possible for you to implement a solution where we can use the RouteObserver?

    So like we do for our MaterialApp:

    MaterialApp(
        home: Container(),
        navigatorObservers: [routeObserver],
      )
    

    There should be a parameter like:

    PersistentTabView(
        navigatorObservers: [routeObserver],
    ..
    

    Thank you in advance

    opened by Yetispapa 7
  • The

    The "Keyboard hiding TextFields" issue

    https://github.com/BilalShahid13/PersistentBottomNavBar/blob/d9fd3ba1b4383169379a9f47917b2df3536270e2/lib/models/persistent_nav_bar_scaffold.widget.dart#L155

    So if resizeToAvoidBottomInset is set to true , why is the code above removing the bottom view insets from MediaQuery?

    The intended behavior should be to have the padding when resizeToAvoidBottomInset is set to true not remove it.

    opened by icnahom 0
  • Jump to specific tab and navigate to a page

    Jump to specific tab and navigate to a page

    Hey, first of all thanks for the great package.

    When pressing a button, i want to jump to a specific tab and then i want to navigate to a specific route under that tab. I cannot do this right now, since i did not find a way to get the context of the specific tab im jumping to.

    My nav bar item is setup this way:

    routeAndNavigatorSettings: RouteAndNavigatorSettings(
                onGenerateRoute: AccountRouter.generateRoutes,
                initialRoute: AccountRoutes.accountPage,
                navigatorKey: G<GlobalKey<NavigatorState>>(),
              )
    

    I really though i could get the context by passing my own global key of navigator state. When i tried to navigate getting the context out of G<GlobalKey<NavigatorState>>() the context is null, so i cannot navigate.

    I realized that i can get the context of the selected tab by using this selectedTabScreenContext, but i do not know if this is the right path to follow.

    opened by rodrigobastosv 0
  • PersistentNavBarNavigator.pushNewScreen not showing bottom navigation on new screen

    PersistentNavBarNavigator.pushNewScreen not showing bottom navigation on new screen

    I have 3 tabs if second bottom navigation icon is clicked then I am opening a popup and from that popup I am using PersistentNavBarNavigator.pushNewScreen( context, screen: DashboardScreen(), withNavBar: true, pageTransitionAnimation: PageTransitionAnimation.cupertino, ); I am navigating to new screen but bottom navigation bar is not present on that screen. What is the issue here please help on priority

    opened by romaankhanAndroid 0
  • How could i show a global SnakBar?

    How could i show a global SnakBar?

    I am using persistent_bottom_nav_bar: ^5.0.2, and until now keep the botton navigation bar for all the screen, but, How can i show a global snakbar? I want to generate a snakcbar in creen A, and when i swich to creen B (using botton navigation) keep it visible. Actually when i swich the snakbar dont show in the other one

      const MainUI({super.key});
    
      @override
      State<MainUI> createState() => _MainUIState();
    }
    
    class _MainUIState extends State<MainUI> {
      late PersistentTabController _controller;
      final screens = [
        SalesPage(), //<- I want that when i change to this one keep wathing it
        ConfigurationPage(), //<- I had inside this screen other screen and in this one is where i show my SnakcBar
      ];
    
      final _navBarsItems = [
        PersistentBottomNavBarItem(
          icon: const Icon(Icons.food_bank),
          title: ("Sales"),
          activeColorPrimary: CupertinoColors.white,
          inactiveColorPrimary: CupertinoColors.systemGrey,
        ),
        PersistentBottomNavBarItem(
          icon: Icon(CupertinoIcons.settings),
          title: ("Configuration"),
          activeColorPrimary: CupertinoColors.white,
          inactiveColorPrimary: CupertinoColors.systemGrey,
        ),
      ];
    
      @override
      void initState() {
        super.initState();
        _controller = PersistentTabController(initialIndex: 0);
      }
    
      @override
      Widget build(BuildContext context) {
        return PersistentTabView(
          key: scaffoldKey,
          backgroundColor: Colors.blue.shade400,
          context,
          screens: screens,
          items: _navBarsItems,
        );
      }
    }
    
    opened by AndryCU 0
  • Having a gradient background using PersistentTabView

    Having a gradient background using PersistentTabView

    Not sure if there is any way to define a gradient background when using PersistentTabView, not the custom one! If not, it would be great if you added such an option as well.

    opened by ZahraVe 0
Owner
Bilal Shahid
Bilal Shahid
Customized 🚀 Bottom Navigation Bar Using Flutter 🐦

Customized ?? Bottom Navigation Bar Using Flutter ??

AmirHossein Bayat 3 Dec 7, 2022
A bottom navigation bar that you can customize with the options you need, without any limits.

Bottom Personalized Dot Bar A bottom navigation bar that you can customize with the options you need, without any limits. You can also customize the a

null 103 Oct 20, 2022
Flutter Navigation Best Practices including adapting navigation to platform and branding techniques for navigation surfaces.

Flutter Navigation Best Practices including adapting navigation to platform and branding techniques for navigation surfaces.

Fred Grott 5 Aug 22, 2022
flutter bottom navigation bat project

bottom_navigation A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you starte

Danushan Ravendran 3 Sep 23, 2021
A Flutter implementation of a customizable navigation bar with animations.

A heavily customizable bottom navigation bar with some animation modifiers.

null 1 Jun 17, 2022
Fast code and awesome design-ui for flutter navigation bar

Flutter-awesome-bottom-navigation-bar ??‍?? Fast code and awesome design-ui for flutter navigation bar ?? Getting Started # First you need to add flas

Hmida 20 Nov 22, 2022
Transparent Android system navigation bar with Flutter and FlexColorScheme package.

Sysnavbar with FlexColorScheme Transparent Android system navigation bar with Flutter and FlexColorScheme. FlexColorScheme V4 Notice If you are using

Rydmike 12 Oct 21, 2022
A Flutter package for easy implementation of curved navigation bar

curved_navigation_bar pub package A Flutter package for easy implementation of curved navigation bar. Add dependency dependencies: curved_navigation

null 556 Dec 9, 2022
A Custom Extended Scaffold with Expandable and Floating Navigation Bar

Custom Extended Scaffold Custom Flutter widgets that makes Bottom Navigation Floating and can be expanded with much cleaner a

Ketan Choyal 139 Dec 10, 2022
Elegant abstraction for complete deep linking navigation in Flutter

Flutter Deep Link Navigation Provides an elegant abstraction for complete deep linking navigation in Flutter. This package only provides deep linking

Dennis Krasnov 64 Dec 27, 2022
A simple and easy to learn declarative navigation framework for Flutter, based on Navigator 2.0.

A simple and easy to learn declarative navigation framework for Flutter, based on Navigator 2.0 (Router). If you love Flutter, you would love declarat

Zeno Nine 20 Jun 28, 2022
A flutter navigation package

Create By Me(Agalaba Ifeanyi Precious) go Navigate Navigate Like a pro from one Screen to another Using go navigate. go_Navigate provide you the abili

Agalaba Ifeanyi Precious 2 Oct 11, 2021
Easy-to-use Navigator 2.0 router for web, mobile and desktop. URL-based routing, simple navigation of tabs and nested routes.

Routemaster Hello! Routemaster is an easy-to-use router for Flutter, which wraps over Navigator 2.0... and has a silly name. Features Simple declarati

Tom Gilder 291 Jan 3, 2023
Flutter Flows made easy! A Flutter package which simplifies navigation flows with a flexible, declarative API.

Flutter Flows made easy! Usage Define a Flow State The flow state will be the state which drives the flow. Each time this state changes, a new navigat

Felix Angelov 337 Dec 31, 2022
Flutter Material Design Navigation Drawer Menu

navigation_drawer_menu Flutter Material Design Navigation Drawer Menu Navigation drawer is a common UI pattern for adaptive menus. The Material Design

Christian Findlay 9 Dec 12, 2022
A Flutter package for easily implementing Material Design navigation transitions.

Morpheus A Flutter package for easily implementing Material Design navigation transitions. Examples Parent-child transition You can use MorpheusPageRo

Sander R. D. Larsen 186 Jan 7, 2023
Flutter custom BottomBar Navigation Widget

bottom_bar_with_sheet ?? Non-standard way to use more space of screens in your application ?? ?? Custom bottom Sheet under Bottom Navigation Bar ?? ??

Stanislav Ilin 305 Dec 23, 2022
Simple but powerfull Flutter navigation with riverpod and Navigator 2.0

Riverpod navigation If you are interested in the motivation why the package was created and a detailed description of what problems it solves, read th

pavelpz 20 Dec 13, 2022
Persistent Bottom Navigation Bar

Persistent Bottom Navigation Bar A persistent/static bottom navigation bar for Flutter. NOTE: Those migrating from pre 2.0.0 version should check the

Bilal Shahid 421 Dec 20, 2022
Flutter-nav-bottom-bar-tutorial - A flutter bottom navigation bar tutorial

Flutter Bottom Navigation Bar Tutorial A tutorial with various Flutter bottom na

Aleyna Eser 2 Oct 25, 2022