DEV Community

Cover image for Flutter Drawer with Custom Icon
Maadhav for CodeDecoders

Posted on

11 2

Flutter Drawer with Custom Icon

Hello guys, this blog post is a part of a video series we have started to upload on YouTube.
Flutter News App (Frontend to Backend)

Here is the video:

In this video, we will have a look at how to create a Drawer with a Custom Icon in Flutter.

So before we customize the icon, lets just build the default Drawer.

Now in our Scafdfold(), there is a parameter named as drawer:

Let's pass the Drawer() widget to this parameter.



drawer: Drawer(
          child: Column(
            children: <Widget>[
              SizedBox(
                height: 30,
              ),
              DrawerHeader(
                child: Container(
                    height: 142,
                    width: MediaQuery.of(context).size.width,
                    child: Image.asset(
                      "assets/images/ten_news.png",
                    )),
                decoration: BoxDecoration(
                  color: Colors.transparent,
                ),
              ),
              SizedBox(
                height: 20,
              ),
              GestureDetector(
                onTap: () {
                  setState(() {
                    currentIndex = 3;
                  });
                  Navigator.of(context).pop();
                },
                child: Text(
                  'Profile',
                  style: TextStyle(
                    fontFamily: 'Avenir',
                    fontSize: 24,
                    fontWeight: FontWeight.w700,
                  ),
                  textAlign: TextAlign.center,
                ),
              ),
              SizedBox(
                height: 45,
              ),
              GestureDetector(
                onTap: () {},
                child: Text(
                  'Settings',
                  style: TextStyle(
                    fontFamily: 'Avenir',
                    fontSize: 24,
                    fontWeight: FontWeight.w700,
                  ),
                  textAlign: TextAlign.center,
                ),
              ),
              SizedBox(
                height: 45,
              ),
              Text(
                'About',
                style: TextStyle(
                  fontFamily: 'Avenir',
                  fontSize: 24,
                  fontWeight: FontWeight.w700,
                ),
                textAlign: TextAlign.center,
              ),
              SizedBox(
                height: 45,
              ),
              Text(
                'Log Out',
                style: TextStyle(
                  fontFamily: 'Avenir',
                  fontSize: 24,
                  fontWeight: FontWeight.w700,
                ),
                textAlign: TextAlign.center,
              ),
              SizedBox(
                height: 45,
              ),
              Expanded(
                  child: Align(
                alignment: Alignment.bottomCenter,
                child: Container(
                  height: 65,
                  width: MediaQuery.of(context).size.width,
                  color: Colors.black,
                  child: Center(
                    child: Text(
                      'v1.0.1',
                      style: TextStyle(
                        fontFamily: 'Avenir',
                        fontSize: 20,
                        color: const Color(0xffffffff),
                      ),
                      textAlign: TextAlign.center,
                    ),
                  ),
                ),
              ))
            ],
          ),
        ),


Enter fullscreen mode Exit fullscreen mode

Now above, inside the Drawer() widget, in the child parameter, we have a passed a Column()

This is just used for the sake of inserting multiple widgets in my drawer.

There is also a widget named, DrawerHeader.
This widget is used for displaying any content on top of the whole drawer. This widget comes with a default divider. We have passed our app logo to it.

Now where is the drawer?

In order to see the drawer, we need to also pass the AppBar() to our Home Page's Scaffold().



Scaffold(
   appBar: AppBar()
);


Enter fullscreen mode Exit fullscreen mode

After building the current project we can see the default hamburger Icon in our AppBar. Pressing on it our drawer opens.

Alt Text

How to Exit the Drawer On Press of a Button?

I order to close the drawer manually i.e on the press of a button, we only need to return the Navigator.of(context).pop() to exit the Drawer.

So let's also add a button on our Drawer.



Material(
                borderRadius: BorderRadius.circular(500),
                child: InkWell(
                  borderRadius: BorderRadius.circular(500),
                  splashColor: Colors.black45,
                  onTap: () {
                    Navigator.of(context).pop();
                  },
                  child: CircleAvatar(
                    radius: 20,
                    backgroundColor: Colors.black,
                    child: Icon(Icons.arrow_back, color: Colors.white),
                  ),
                ),
              ),


Enter fullscreen mode Exit fullscreen mode

Now on pressing the button the drawer closes.

How to change the default Hamburger Icon?

This question had arrived in my mind on the first day I had learned to build a Drawer in Flutter.

Now in order to have a custom Icon, lets remove the default one first.



 AppBar(
        automaticallyImplyLeading: false,
),


Enter fullscreen mode Exit fullscreen mode

automaticallyImplyLeading set to false would just remove the default icon.

Now let's pass out Icon to either leading: or title: parameter.



appBar: AppBar(
        automaticallyImplyLeading: false,
        title: Padding(
          padding: EdgeInsets.symmetric(horizontal: 25),
          child: Builder(
            builder: (context) => IconButton(
              icon: SvgPicture.asset(
                "assets/icons/drawer.svg",
                height: 15,
                width: 34,
              ),
              onPressed: () => Scaffold.of(context).openDrawer(),
            ),
          ),
        ),
        backgroundColor: Colors.white,
        elevation: 0,
        centerTitle: false,
        titleSpacing: 0,
      ),


Enter fullscreen mode Exit fullscreen mode

Now in the above code, there are a few importing things:

  • Builder(): We use a Builder class to pass the context of the Scaffold widget to a particular widget. More Info: https://stackoverflow.com/a/52123080/6484719
  • Scaffold.of(context).openDrawer(): This is why used the builder widget, to get the current context of the scaffold and then open the drawer.

Finally, our output:
Alt Text

👨‍💻Source Code: https://github.com/Code-Decoders/ten_news_yt/tree/Part-2--Drawer




💐Join Our Slack Group: https://bit.ly/JoinSlackCD

✌Subscribe to CodeDecoders: http://bit.ly/CodeDecoders

💮Design Link: https://xd.adobe.com/view/99205dd3-7fe4-44bb-9edd-dd2a75290cbf-cc73/screen/90d0c71c-26b7-44d1-b29d-6578cbd87884

🤝Developed by
Maadhav Sharma:
🌐 https://maadhav.github.io/
🐤 https://twitter.com/maadhav_sharma
📘 https://www.facebook.com/maadhav2001
📷 https://www.instagram.com/maadhav_sharma/
Kunal Jain:
📷 https://www.instagram.com/jainkunal528

Tiugo image

Modular, Fast, and Built for Developers

CKEditor 5 gives you full control over your editing experience. A modular architecture means you get high performance, fewer re-renders and a setup that scales with your needs.

Start now

Top comments (0)

Image of PulumiUP 2025

Let's talk about the current state of cloud and IaC, platform engineering, and security.

Dive into the stories and experiences of innovators and experts, from Startup Founders to Industry Leaders at PulumiUP 2025.

Register Now

👋 Kindness is contagious

Engage with a wealth of insights in this thoughtful article, valued within the supportive DEV Community. Coders of every background are welcome to join in and add to our collective wisdom.

A sincere "thank you" often brightens someone’s day. Share your gratitude in the comments below!

On DEV, the act of sharing knowledge eases our journey and fortifies our community ties. Found value in this? A quick thank you to the author can make a significant impact.

Okay