How to make drawer widget transparent

462

Solution 1

Have you tried

Color = Colors.transparent and set elevation = 0

hope this can help you, thank you

Solution 2

Here's the solution I found in the main.dart below the scaffold part instead of using the below code:

drawer: NavigationDrawerWidget(),

use this one by adding the theme:

drawer: Theme(
          data: Theme.of(context).copyWith(
            // Set the transparency here
            canvasColor: Colors
                .transparent, 
          ),
          child: NavigationDrawerWidget(),
        ),

it's shows like the below image:

result

Share:
462
Mahmoud Harooney
Author by

Mahmoud Harooney

Updated on December 29, 2022

Comments

  • Mahmoud Harooney
    Mahmoud Harooney over 1 year

    I am trying to make the drawer transparent with opacity as the below code:

    color: Colors.black.withOpacity(0.36),
    

    for the below drawer widget:

    Drawer(
            child: Container(
              // color: Color(0xFF1a2f45),
              color: Colors.black.withOpacity(0.36),
              // color: Colors.transparent,
              child: Column(
                children: [
                  Container(
                    padding: EdgeInsets.symmetric(vertical: 24).add(safeArea),
                    width: double.infinity,
                    color: Colors.transparent,
                    child: buildHeader(isCollapsed),
                  ),
                  const SizedBox(height: 24),
                  buildList(items: itemsFirst, isCollapsed: isCollapsed),
                  const SizedBox(height: 24),
                  Divider(color: Colors.white70),
                  const SizedBox(height: 24),
                  buildList(
                    indexOffset: itemsFirst.length,
                    items: itemsSecond,
                    isCollapsed: isCollapsed,
                  ),
                  Spacer(),
                  buildCollapseIcon(context, isCollapsed),
                  const SizedBox(height: 12),
                ],
              ),
            ),
          ),
    

    but I see that there's a default color with white in the drawer widget so how can I make it transparent then?

    this is the below full code:

    class NavigationDrawerWidget extends StatelessWidget {
      final padding = EdgeInsets.symmetric(horizontal: 20);
    
      @override
      Widget build(BuildContext context) {
        final safeArea =
            EdgeInsets.only(top: MediaQuery.of(context).viewPadding.top);
    
        final provider = Provider.of<NavigationProvider>(context);
        final isCollapsed = provider.isCollapsed;
    
        return Container(
          width: isCollapsed ? MediaQuery.of(context).size.width * 0.2 : null,
          child: Drawer(
            child: Container(
              // color: Color(0xFF1a2f45),
              color: Colors.black.withOpacity(0.36),
              // color: Colors.transparent,
              child: Column(
                children: [
                  Container(
                    padding: EdgeInsets.symmetric(vertical: 24).add(safeArea),
                    width: double.infinity,
                    color: Colors.transparent,
                    child: buildHeader(isCollapsed),
                  ),
                  const SizedBox(height: 24),
                  buildList(items: itemsFirst, isCollapsed: isCollapsed),
                  const SizedBox(height: 24),
                  Divider(color: Colors.white70),
                  const SizedBox(height: 24),
                  buildList(
                    indexOffset: itemsFirst.length,
                    items: itemsSecond,
                    isCollapsed: isCollapsed,
                  ),
                  Spacer(),
                  buildCollapseIcon(context, isCollapsed),
                  const SizedBox(height: 12),
                ],
              ),
            ),
          ),
        );
      }
    
      Widget buildList({
        required bool isCollapsed,
        required List<DrawerItem> items,
        int indexOffset = 0,
      }) =>
          ListView.separated(
            padding: isCollapsed ? EdgeInsets.zero : padding,
            shrinkWrap: true,
            primary: false,
            itemCount: items.length,
            separatorBuilder: (context, index) => SizedBox(height: 16),
            itemBuilder: (context, index) {
              final item = items[index];
    
              return buildMenuItem(
                isCollapsed: isCollapsed,
                text: item.title,
                icon: item.icon,
                onClicked: () => selectItem(context, indexOffset + index),
              );
            },
          );
    
      void selectItem(BuildContext context, int index) {
        final navigateTo = (page) => Navigator.of(context).push(MaterialPageRoute(
              builder: (context) => page,
            ));
    
        Navigator.of(context).pop();
    
        switch (index) {
          case 0:
            navigateTo(GetStartedPage());
            break;
          case 1:
            navigateTo(SamplesPage());
            break;
          case 2:
            navigateTo(TestingPage());
            break;
          case 3:
            navigateTo(PerformancePage());
            break;
          case 4:
            navigateTo(DeploymentPage());
            break;
          case 5:
            navigateTo(ResourcesPage());
            break;
        }
      }
    
      Widget buildMenuItem({
        required bool isCollapsed,
        required String text,
        required IconData icon,
        VoidCallback? onClicked,
      }) {
        final color = Colors.white;
        final leading = Icon(icon, color: color);
    
        return Material(
          color: Colors.transparent,
          child: isCollapsed
              ? ListTile(
                  title: leading,
                  onTap: onClicked,
                )
              : ListTile(
                  leading: leading,
                  title: Text(text, style: TextStyle(color: color, fontSize: 16)),
                  onTap: onClicked,
                ),
        );
      }
    
      Widget buildCollapseIcon(BuildContext context, bool isCollapsed) {
        final double size = 52;
        final icon = isCollapsed ? Icons.arrow_forward_ios : Icons.arrow_back_ios;
        final alignment = isCollapsed ? Alignment.center : Alignment.centerRight;
        final margin = isCollapsed ? null : EdgeInsets.only(right: 16);
        final width = isCollapsed ? double.infinity : size;
    
        return Container(
          alignment: alignment,
          margin: margin,
          child: Material(
            color: Colors.transparent,
            child: InkWell(
              child: Container(
                width: width,
                height: size,
                child: Icon(icon, color: Colors.white),
              ),
              onTap: () {
                final provider =
                    Provider.of<NavigationProvider>(context, listen: false);
    
                provider.toggleIsCollapsed();
              },
            ),
          ),
        );
      }
    
      Widget buildHeader(bool isCollapsed) => isCollapsed
          ? FlutterLogo(size: 48)
          : Row(
              children: [
                const SizedBox(width: 24),
                FlutterLogo(size: 48),
                const SizedBox(width: 16),
                Text(
                  'Flutter',
                  style: TextStyle(fontSize: 32, color: Colors.white),
                ),
              ],
            );
    }
    

    and this is the below result image:

    enter image description here

  • Mahmoud Harooney
    Mahmoud Harooney about 3 years
    I think this one is the best solution