Enable FlutterFlow's built-in Drawer under Page Properties, then customize it with a Column containing a user avatar, display name, and navigation menu items. Style each item as a ListTile with an icon and label. Use Conditional Widgets for role-based menu items. Always build the drawer as a Reusable Component — adding it from scratch to every page is the most common and costly mistake.
Building a Polished App Drawer in FlutterFlow
The app drawer is the navigation hub your users return to constantly. FlutterFlow provides a built-in Drawer via the Scaffold configuration, but most tutorials stop at enabling it and dropping in a few buttons. This guide goes further: building a professional drawer with a user profile header, role-based conditional items, branded styling, and — most importantly — packaging it as a Reusable Component so you add it once and use it on every page without duplication.
Prerequisites
- FlutterFlow project with at least two pages
- Firebase Authentication configured (for displaying user info in the drawer header)
- Basic understanding of FlutterFlow page structure and widget tree
Step-by-step guide
Enable the Drawer in Page Properties
Enable the Drawer in Page Properties
Click on your page canvas (not on any widget) to select the page itself. In the Properties panel on the right, scroll down to find the Scaffold section. Look for the Drawer toggle and switch it on. FlutterFlow will add a Drawer panel to your page widget tree, visible in the Widget Tree panel on the left side of the editor. The drawer is now accessible by swiping from the left edge of the screen or tapping a hamburger menu icon. If you want to add an AppBar with a hamburger icon that opens the drawer, enable the AppBar in the same Scaffold section and the menu icon will appear automatically.
Expected result: A Drawer panel appears in your page's Widget Tree. Swiping from the left edge in the FlutterFlow preview opens an empty drawer panel.
Build a Reusable Component for the drawer content
Build a Reusable Component for the drawer content
Before adding any content, create a Reusable Component — this is the single most important step. In the left sidebar, click Components (the puzzle piece icon) and press the '+' button to create a new component. Name it AppDrawerContent. Inside the component, add a SafeArea as the root widget, then a Column inside it. Set the Column's width to 280px and add padding of 16px on all sides. This component will contain your entire drawer UI. On each page, instead of building the drawer directly, you will reference this component inside the page's Drawer panel.
Expected result: An AppDrawerContent component exists in the Components panel. It contains a SafeArea and Column ready for content.
Add the user profile header to the drawer
Add the user profile header to the drawer
Inside the Column in AppDrawerContent, add a Container with a background color using your app's primary color or a dark gradient. Inside it, add a Row containing a CircleImage widget (set source to 'Authenticated User' → photoURL) and a Column with two Text widgets: one for the display name (source: Authenticated User → displayName) and one for the email. Set the Container height to 180px to create a spacious header. Add a SizedBox with height 8 below the header container to separate it from the menu items. If the user has no profile photo, set a fallback image URL to a default avatar.
Expected result: The drawer shows the logged-in user's profile photo, name, and email in a colored header section at the top.
Add navigation menu items with icons and labels
Add navigation menu items with icons and labels
Below the header, add menu items for your main navigation sections. For each item, use an InkWell wrapping a Padding wrapping a Row. The Row contains an Icon widget (pick from Material icons) and a Text widget for the label, separated by a SizedBox width 16. Set the InkWell's OnTap action to Navigate to the target page. Alternatively, use FlutterFlow's ListTile widget which provides a ready-made layout with leading icon, title, and onTap. Add a Divider widget between logical sections of menu items. At the bottom of the Column, add a Spacer widget to push a Sign Out item to the bottom of the drawer.
Expected result: The drawer shows a styled list of navigation items with icons. Tapping each item navigates to the correct page and closes the drawer automatically.
Add conditional menu items based on user role
Add conditional menu items based on user role
Admin-only features should not appear in the drawer for regular users. In FlutterFlow, use Conditional Visibility on any menu item you want to restrict. Click the menu item widget, go to the Conditional Visibility section in the Properties panel, and add a condition. For role-based conditions, create an App State variable named userRole (String) populated when the user logs in (query their Firestore user document for a role field). Show admin menu items only when userRole equals 'admin'. For premium features, show or style the item differently when userRole equals 'premium' — for example, show a Lock icon next to premium-only items for free users.
Expected result: Admin users see additional menu items in the drawer (Dashboard, User Management, etc.) that are completely hidden for regular users.
Attach the Component to each page's Drawer
Attach the Component to each page's Drawer
Now that your AppDrawerContent component is complete, add it to every page. On each page, click the Drawer panel in the Widget Tree (it appears after the page body). Inside the Drawer panel, add your AppDrawerContent component from the Components list. If you added an activePage parameter to the component, pass the current page name as the parameter value — this highlights the active item in the menu. For a new page, the process takes under 30 seconds: enable Drawer in Scaffold → add AppDrawerContent component. All styling and logic updates automatically across all pages when you edit the component.
Expected result: Every page in your app shows the same consistent drawer. Editing the AppDrawerContent component updates the drawer across all pages simultaneously.
Complete working example
1// Custom Widget: DrawerMenuItem2// A reusable styled menu item for the app drawer3import 'package:flutter/material.dart';45class DrawerMenuItem extends StatelessWidget {6 final IconData icon;7 final String label;8 final bool isActive;9 final bool isLocked;10 final VoidCallback onTap;1112 const DrawerMenuItem({13 Key? key,14 required this.icon,15 required this.label,16 this.isActive = false,17 this.isLocked = false,18 required this.onTap,19 }) : super(key: key);2021 @override22 Widget build(BuildContext context) {23 final theme = Theme.of(context);2425 return InkWell(26 onTap: isLocked ? null : onTap,27 borderRadius: BorderRadius.circular(8),28 child: Container(29 padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10),30 decoration: BoxDecoration(31 color: isActive32 ? theme.colorScheme.primary.withOpacity(0.12)33 : Colors.transparent,34 borderRadius: BorderRadius.circular(8),35 ),36 child: Row(37 children: [38 Icon(39 icon,40 size: 20,41 color: isActive42 ? theme.colorScheme.primary43 : theme.colorScheme.onSurface.withOpacity(0.7),44 ),45 const SizedBox(width: 16),46 Expanded(47 child: Text(48 label,49 style: TextStyle(50 fontSize: 15,51 fontWeight:52 isActive ? FontWeight.w600 : FontWeight.w400,53 color: isActive54 ? theme.colorScheme.primary55 : theme.colorScheme.onSurface,56 ),57 ),58 ),59 if (isLocked)60 Icon(61 Icons.lock_outline,62 size: 16,63 color: theme.colorScheme.onSurface.withOpacity(0.4),64 ),65 ],66 ),67 ),68 );69 }70}Common mistakes when customizing the App Drawer in FlutterFlow
Why it's a problem: Rebuilding the drawer from scratch on every page instead of using a Reusable Component
How to avoid: Build the drawer content as a Reusable Component named AppDrawerContent. Add this component to the Drawer panel on each page. All pages update automatically when the component is edited.
Why it's a problem: Enabling the Drawer without enabling an AppBar with a menu icon
How to avoid: Enable the AppBar in Scaffold settings. FlutterFlow automatically adds a DrawerButton (hamburger icon) to the AppBar when a Drawer is also enabled.
Why it's a problem: Querying Firestore inside the drawer component to get the user's role on every render
How to avoid: Query the user's role once when they log in and store it in App State. Pass the role into the AppDrawerContent component as a parameter rather than fetching it on every drawer open.
Best practices
- Always build the drawer as a Reusable Component — never duplicate drawer code across pages.
- Load the user's role into App State at login time and pass it as a component parameter, not a Firestore query on each open.
- Add a close button or swipe-to-close hint for users unfamiliar with material drawer gesture navigation.
- Use a Divider widget to visually separate drawer sections like navigation, preferences, and account actions.
- Keep drawer items to a maximum of 7 — anything more should be in a separate settings page accessible from the drawer.
- Test the drawer on both iOS and Android: iOS users may expect swipe-from-left to trigger navigation back, which conflicts with drawer swipe-to-open behavior.
- Add smooth open/close animation by ensuring the Scaffold's drawerEdgeDragWidth is set appropriately — FlutterFlow exposes this in the Drawer settings.
Still stuck?
Copy one of these prompts to get a personalized, step-by-step explanation.
I am building a FlutterFlow app and want to create a custom navigation drawer with a user profile header, icon-based menu items, and role-based conditional items. Explain the best approach using FlutterFlow's Scaffold Drawer and Reusable Components.
Create a Reusable Component in FlutterFlow for my app drawer. It should show the logged-in user's avatar and name at the top, then navigation links with icons for Home, Profile, and Settings. Add a conditional admin section visible only when the userRole App State variable equals 'admin'.
Frequently asked questions
Where do I enable the Drawer in FlutterFlow?
Click on your page canvas (not any widget) to select the page itself. In the Properties panel on the right, find the Scaffold section and toggle the Drawer option on. A Drawer panel will appear in your widget tree where you can add content.
How do I open the drawer programmatically (not by swiping)?
Add a Custom Action with this Dart code: Scaffold.of(context).openDrawer(). Trigger it from a button's OnTap action. For the standard hamburger button in the AppBar, FlutterFlow adds it automatically when you enable both AppBar and Drawer in Scaffold settings.
Can I use a Reusable Component inside a Drawer panel?
Yes. Click the Drawer panel in the Widget Tree to select it, then add your Reusable Component from the widget picker. This is the recommended approach — it keeps the drawer code in one place and updates all pages when the component changes.
How do I close the drawer after a menu item is tapped?
FlutterFlow closes the drawer automatically when the user navigates to a new page. If you perform an action without navigation (like showing a dialog), add a Custom Action with Navigator.of(context).pop() to manually close the drawer after the action.
Can I have a right-side drawer in FlutterFlow?
Yes. In the Scaffold section of Page Properties, look for the End Drawer option alongside the Drawer option. The end drawer slides in from the right side and is opened by swiping from the right edge or via Scaffold.of(context).openEndDrawer().
How do I highlight the active page in the drawer menu?
Add a String parameter named activePage to your AppDrawerContent component. Pass the current page route name when adding the component to each page. Use Conditional Visibility or a Conditional Widget to style the matching menu item differently — for example, change its background color or font weight.
Does the drawer work on web builds of FlutterFlow apps?
Yes, but the user experience differs. On mobile web, users can swipe to open. On desktop web, the drawer typically stays visible as a permanent sidebar rather than overlaying content. Consider using FlutterFlow's responsive layout conditions to switch between a permanent sidebar on wide screens and a collapsible drawer on mobile.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation