Search code examples
flutterflutter-dependencies

How To Create a Floating Menu Card Box in Flutter


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


Solution

  • 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);
      }
    }