skip to Main Content

I’m trying to replicate an UI from a figma screen. But I’m stuck with this widget, and I wonder if material (or any external) package has anytying similiar to this, that could help me, or I’ll need to create this by hand? Its like a floating menu card that its called by the center blue button to give the user the ability to navigate between all screens.

enter image description here

2

Answers


  1. Okay, so from the UI, you’re supposed to have a bottomNavbar with three screens, the middle screen contains a container/card with different buttons in it.

    i have created something similar for this purpose, i hope it helps.

    Bottom Nav Bar:

    class BottomNavBar extends StatefulWidget {
      const BottomNavBar({Key? key}) : super(key: key);
    
      @override
      State<BottomNavBar> createState() => _BottomNavBarState();
    }
    
    class _BottomNavBarState extends State<BottomNavBar> {
      int currentIndex = 0;
      final screens = [
        const FirstScreen(),
        const SecondScreen(),
        const ThirdScreen()
      ];
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: IndexedStack(
            index: currentIndex,
            children: screens,
          ),
          bottomNavigationBar: BottomNavigationBar(
            selectedItemColor: const Color.fromRGBO(50, 201, 209, 1),
            type: BottomNavigationBarType.fixed,
            currentIndex: currentIndex,
            onTap: (index) => setState(() => currentIndex = index),
            backgroundColor: Colors.transparent,
            elevation: 0,
            iconSize: 30,
            items: const [
              BottomNavigationBarItem(
                icon: Icon(
                  Icons.home_outlined,
                ),
                label: 'Home',
              ),
              BottomNavigationBarItem(
                icon: Icon(
                  Icons.shopping_cart_outlined,
                ),
                label: 'Orders',
              ),
              BottomNavigationBarItem(
                icon: Icon(
                  Icons.production_quantity_limits_rounded,
                ),
                label: 'Products',
              ),
            ],
          ),
        );
      }
    }
    

    Card/container widget:

    class ArrowClipper extends CustomClipper<Path> {
      @override
      Path getClip(Size size) {
        final path = Path();
        path.moveTo(0, 0);
        path.lineTo(size.width, 0);
        path.lineTo(size.width, size.height - 30);
        path.lineTo(size.width / 2 + 10, size.height - 30);
        path.lineTo(size.width / 2, size.height);
        path.lineTo(size.width / 2 - 10, size.height - 30);
        path.lineTo(0, size.height - 30);
        path.close();
        return path;
      }
    
      @override
      bool shouldReclip(ArrowClipper oldClipper) => false;
    }
    

    The screens:

    class ThirdScreen extends StatelessWidget {
      const ThirdScreen({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Container();
      }
    }
    
    class SecondScreen extends StatelessWidget {
      const SecondScreen({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          backgroundColor: Colors.grey[100],
          body: Column(
            mainAxisAlignment: MainAxisAlignment.end,
            children: [
              ClipPath(
                clipper: ArrowClipper(),
                child: Padding(
                  padding: const EdgeInsets.symmetric(horizontal: 20),
                  child: Container(
                    height: 300,
                    width: double.infinity,
                    decoration: BoxDecoration(
                      color: Colors.white,
                      boxShadow: [
                        BoxShadow(
                          color: Colors.grey.withOpacity(0.5),
                          spreadRadius: 2,
                          blurRadius: 5,
                          offset: const Offset(0, 3), // changes position of shadow
                        ),
                      ],
                    ),
                    child: Center(
                        child: Column(
                      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                      children: [
                        Row(
                          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                          children: const [
                            CircleAvatar(
                              backgroundColor: Colors.red,
                            ),
                            CircleAvatar(
                              backgroundColor: Colors.yellow,
                            ),
                            CircleAvatar(
                              backgroundColor: Colors.green,
                            )
                          ],
                        ),
                        Row(
                          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                          children: const [
                            CircleAvatar(
                              backgroundColor: Colors.red,
                            ),
                            CircleAvatar(
                              backgroundColor: Colors.yellow,
                            ),
                            CircleAvatar(
                              backgroundColor: Colors.green,
                            )
                          ],
                        ),
                        Row(
                          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                          children: const [
                            CircleAvatar(
                              backgroundColor: Colors.red,
                            ),
                            CircleAvatar(
                              backgroundColor: Colors.yellow,
                            ),
                            CircleAvatar(
                              backgroundColor: Colors.green,
                            )
                          ],
                        )
                      ],
                    )),
                  ),
                ),
              )
            ],
          ),
        );
      }
    }
    class FirstScreen extends StatelessWidget {
      const FirstScreen({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Container();
      }
    }
    
    Login or Signup to reply.
  2. Check this package https://github.com/chinabrant/popup_menu

    import 'package:flutter/material.dart';
    import 'package:popup_menu/popup_menu.dart';
    import 'package:popup_menu_example/gesture_demo.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          home: MyHomePage(title: 'Popup Menu Example'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      PopupMenu menu;
      GlobalKey btnKey = GlobalKey();
      GlobalKey btnKey2 = GlobalKey();
    
      @override
      void initState() {
        super.initState();
    
        menu = PopupMenu(items: [
          // MenuItem(title: 'Copy', image: Image.asset('assets/copy.png')),
          // MenuItem(title: 'Home', image: Icon(Icons.home, color: Colors.white,)),
          MenuItem(
              title: 'Mail',
              image: Icon(
                Icons.mail,
                color: Colors.white,
              )),
          MenuItem(
              title: 'Power',
              image: Icon(
                Icons.power,
                color: Colors.white,
              )),
          MenuItem(
              title: 'Setting',
              image: Icon(
                Icons.settings,
                color: Colors.white,
              )),
          MenuItem(
              title: 'PopupMenu',
              image: Icon(
                Icons.menu,
                color: Colors.white,
              ))
        ], onClickMenu: onClickMenu, onDismiss: onDismiss, maxColumn: 1);
      }
    
      void stateChanged(bool isShow) {
        print('menu is ${isShow ? 'showing' : 'closed'}');
      }
    
      void onClickMenu(MenuItemProvider item) {
        print('Click menu -> ${item.menuTitle}');
      }
    
      void onDismiss() {
        print('Menu is dismiss');
      }
    
      @override
      Widget build(BuildContext context) {
        PopupMenu.context = context;
    
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
            actions: <Widget>[
              // action button
              IconButton(
               key: btnKey,
                icon: Icon(Icons.access_time),
                onPressed: () {
                  maxColumn();
                },
              ),
              IconButton(
                key: btnKey2,
                icon: Icon(Icons.memory),
                onPressed: () {
                  maxColumn();
                },
              )
            ],
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: <Widget>[
                Container(
                  child: GestureDetector(
                    onLongPress: () {
                      //maxColumn();
                    },
                    child: MaterialButton(
                      height: 45.0,
                      //key: btnKey,
                      child: Text('Show Menu'),
                    ),
                  ),
                ),
              ],
            ),
          ),
        );
      }
    
      void onGesturesDemo() {
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => GestureDemo()),
        );
      }
    
      void checkState(BuildContext context) {
        final snackBar = new SnackBar(content: new Text('这是一个SnackBar!'));
    
        Scaffold.of(context).showSnackBar(snackBar);
      }
    
      void maxColumn() {
        PopupMenu menu = PopupMenu(
            // backgroundColor: Colors.teal,
            // lineColor: Colors.tealAccent,
            maxColumn: 3,
            items: [
              MenuItem(title: 'Copy', image: Image.asset('assets/copy.png')),
              // MenuItem(
              //     title: 'Home',
              //     // textStyle: TextStyle(fontSize: 10.0, color: Colors.tealAccent),
              //     image: Icon(
              //       Icons.home,
              //       color: Colors.white,
              //     )),
              // MenuItem(
              //     title: 'Mail',
              //     image: Icon(
              //       Icons.mail,
              //       color: Colors.white,
              //     )),
              MenuItem(
                  title: 'Power',
                  image: Icon(
                    Icons.power,
                    color: Colors.white,
                  )),
              MenuItem(
                  title: 'Setting',
                  image: Icon(
                    Icons.settings,
                    color: Colors.white,
                  )),
              MenuItem(
                  title: 'PopupMenu',
                  image: Icon(
                    Icons.menu,
                    color: Colors.white,
                  ))
            ],
            onClickMenu: onClickMenu,
            stateChanged: stateChanged,
            onDismiss: onDismiss);
        menu.show(widgetKey: btnKey);
      }
    
      //
      void customBackground() {
        PopupMenu menu = PopupMenu(
            // backgroundColor: Colors.teal,
            // lineColor: Colors.tealAccent,
            // maxColumn: 2,
            items: [
              MenuItem(title: 'Copy', image: Image.asset('assets/copy.png')),
              MenuItem(
                  title: 'Home',
                  // textStyle: TextStyle(fontSize: 10.0, color: Colors.tealAccent),
                  image: Icon(
                    Icons.home,
                    color: Colors.white,
                  )),
              MenuItem(
                  title: 'Mail',
                  image: Icon(
                    Icons.mail,
                    color: Colors.white,
                  )),
              MenuItem(
                  title: 'Power',
                  image: Icon(
                    Icons.power,
                    color: Colors.white,
                  )),
              MenuItem(
                  title: 'Setting',
                  image: Icon(
                    Icons.settings,
                    color: Colors.white,
                  )),
              MenuItem(
                  title: 'PopupMenu',
                  image: Icon(
                    Icons.menu,
                    color: Colors.white,
                  ))
            ],
            onClickMenu: onClickMenu,
            stateChanged: stateChanged,
            onDismiss: onDismiss);
        menu.show(widgetKey: btnKey2);
      }
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search