如何在flutter中改变PopupMenuItem的背景颜色?
现在我只是改变了 PopupMenuItem 的孩子的颜色,结果是这样的:
代码如下:
PopupMenuButton<int>(
onSelected: (value) {
// TODO: Implement onSelect
},
offset: Offset(50, 50),
itemBuilder: (context) => [
PopupMenuItem(
value: 1,
child: Container(
height: double.infinity,
width: double.infinity,
color: Colors.greenAccent, // i use this to change the bgColor color right now
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Icon(Icons.check),
SizedBox(width: 10.0),
Text("Konfirmasi Update"),
SizedBox(width: 10.0),
],
),
),
),
我想要的是更改“Konfirmasi Update”选项的背景颜色,正如您在上图中看到的那样,颜色在选项外留下了白色区域。
如何完全改变 PopupMenuItem 的背景颜色,而不留下 PopupMenuItem 外部的白色区域?
另一种选择是继承自 PopupMenuItem。
仅使用更改 CustomPopupMenuItem 的 PopupMenuButton 并设置颜色。
import 'package:flutter/material.dart';
class CustomPopupMenuItem<T> extends PopupMenuItem<T> {
final Color color;
const CustomPopupMenuItem({
Key key,
T value,
bool enabled = true,
Widget child,
this.color,
}) : super(key: key, value: value, enabled: enabled, child: child);
@override
_CustomPopupMenuItemState<T> createState() => _CustomPopupMenuItemState<T>();
}
class _CustomPopupMenuItemState<T> extends PopupMenuItemState<T, CustomPopupMenuItem<T>> {
@override
Widget build(BuildContext context) {
return Container(
child: super.build(context),
color: widget.color,
);
}
}
没有办法使用开箱即用的
PopupMenuButton
和PopupMenuItem
小部件,因为如果你检查源代码,垂直和水平填充有硬编码值。
我修改了
popup_menu.dart
文件的代码,具体是这些值:
const double _kMenuVerticalPadding = 0.0;//8.0;
const double _kMenuHorizontalPadding = 0.0;//16.0;
如果你想让它工作,下载这个文件到你的项目:https://gist.github.com/diegoveloper/995f1e03ef225edc64e06525dc024b01
在您的项目中导入该文件并添加别名:
import 'your_project/my_popup_menu.dart' as mypopup;
用法:
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: mypopup.PopupMenuButton<int>(
elevation: 20,
onSelected: (value) {
// TODO: Implement onSelect
},
offset: Offset(50, 50),
itemBuilder: (context) => [
mypopup.PopupMenuItem(
value: 1,
child: Container(
height: double.infinity,
width: double.infinity,
color: Colors
.greenAccent, // i use this to change the bgColor color right now
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Icon(Icons.check),
SizedBox(width: 10.0),
Text("Konfirmasi Update"),
SizedBox(width: 10.0),
],
),
),
),
mypopup.PopupMenuItem(
value: 1,
child: Container(
height: double.infinity,
width: double.infinity,
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Icon(Icons.check),
SizedBox(width: 10.0),
Text("Revisi Update"),
SizedBox(width: 10.0),
],
),
),
),
],
),
),
);
}
结果
您可以将 PopupMenuButton 放在主题中,在您的主题中,您必须为您想要的背景颜色更新 cardColor,如下所示:
Center(
child: Theme(
data: Theme.of(context).copyWith(
cardColor: Colors.greenAccent,
),
child: PopupMenuButton<int>(
onSelected: (value) {
},
offset: Offset(50, 50),
itemBuilder: (context) => [
PopupMenuItem(
value: 1,
child: Container(
height: double.infinity,
width: double.infinity,
color: Colors.greenAccent, // i use this to change the bgColor color right now
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Icon(Icons.check),
SizedBox(width: 10.0),
Text("Konfirmasi Update"),
SizedBox(width: 10.0),
],
),
),
)
]
)
)
)
对于 Flutter 3.7 我修改了@erli proposition 到这样的版本:
class CustomPopupMenuItem<T> extends PopupMenuItem<T> {
const CustomPopupMenuItem({
super.key,
super.value,
super.onTap,
super.height,
super.enabled,
super.child,
this.color,
});
final Color? color;
@override
CustomPopupMenuItemState<T> createState() => CustomPopupMenuItemState<T>();
}
class CustomPopupMenuItemState<T>
extends PopupMenuItemState<T, CustomPopupMenuItem<T>> {
@override
Widget build(BuildContext context) {
return Material(
color: widget.color,
child: super.build(context),
);
}
}
更改整个菜单或仅更改其子项的颜色非常容易。
使用正则颜色表达式。 颜色:Colors.red 或任何你喜欢的颜色。
您可以在
PopupMenuButton()
或PopupMenuItem()
中使用它。