【发布时间】:2021-04-27 01:17:23
【问题描述】:
我正在尝试使抽屉透明且不透明,如下代码所示:
color: Colors.black.withOpacity(0.36),
对于下面的抽屉小部件:
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),
],
),
),
),
但我看到抽屉小部件中有一个默认颜色为白色,那么我怎样才能让它透明呢?
这是下面的完整代码:
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),
),
],
);
}
这是下面的结果图像:
【问题讨论】: