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:
Author by
Mahmoud Harooney
Updated on December 29, 2022Comments
-
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:
-
Mahmoud Harooney about 3 yearsI think this one is the best solution