Drop down menu 我应该如何在Flatter中自定义DropdownButtons和DropdownMenuItems?
DropdownMenuItems的默认值返回浅灰色下拉列表。我应该如何自定义下拉列表(例如背景色、下拉列表宽度)?我可以更改DropdownButton和DropdownMenuItem中的Drop down menu 我应该如何在Flatter中自定义DropdownButtons和DropdownMenuItems?,drop-down-menu,widget,dropdown,flutter,Drop Down Menu,Widget,Dropdown,Flutter,DropdownMenuItems的默认值返回浅灰色下拉列表。我应该如何自定义下拉列表(例如背景色、下拉列表宽度)?我可以更改DropdownButton和DropdownMenuItem中的样式属性,如下所示: return new DropdownButton( value: ..., items: ..., onChanged: ..., style: new TextStyle( color: Colors.white,
样式
属性,如下所示:
return new DropdownButton(
value: ...,
items: ...,
onChanged: ...,
style: new TextStyle(
color: Colors.white,
),
);
Container(
margin: const EdgeInsets.all(15.0),
padding: const EdgeInsets.only(left: 10.0, right: 10.0),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: Colors.white)
),
child: DropdownButton(
dropdownColor: Colors.white,
style: TextStyle(
color: Colors.black,
backgroundColor: Colors.white,
),
value: 'ar',
items: [
DropdownMenuItem(child: Text('English'), value: 'en'),
DropdownMenuItem(child: Text('العربية'), value: 'ar'),
],
),
)
但这不会改变下拉列表的背景色
我应该复制下拉菜单并扩展它吗?Flatter是否计划在不久的将来为该小部件添加自定义项?您可以通过将包装到小部件中并覆盖来实现这一点
导入“包装:颤振/材料.省道”;
void main(){
runApp(新的MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
主页:新建MyHomePage(),
);
}
}
类MyHomePage扩展StatefulWidget{
State createState()=>新建MyHomePageState();
}
类MyHomePageState扩展了状态{
int _值=42;
@凌驾
小部件构建(构建上下文){
归还新脚手架(
正文:新中心(
儿童:新主题(
数据:Theme.of(context).copyWith(
画布颜色:Colors.blue.shade200,
),
孩子:新的下拉按钮(
值:_值,
项目:[
新下拉菜单项(
子项:新文本('Foo'),
值:0,
),
新下拉菜单项(
子项:新文本('Bar'),
价值:42,
),
],
onChanged:(int值){
设置状态(){
_价值=价值;
});
},
),
),
),
);
}
}
正如科林所说,您的下拉菜单项将跟随您的课程。不仅它的backgroundColor
将与ThemeData
类中的canvasColor
匹配,而且它将遵循相同的TextStyle
举个简单的例子:
new ThemeData(
fontFamily: "Encode Sans", //my custom font
canvasColor: _turquoise, //my custom color
//other theme data)
此外,如果您想控制菜单的宽度
,可以为其子属性提供一个新的容器
,并添加所需的宽度
,检查以下GIF,我从宽度开始:100.0
,然后在将其更改为200.0
后重新热加载,注意width
是如何操作的,请确保使用合适的宽度,以便以后在更复杂的布局中使用菜单时不会出现溢出问题
我可以通过使用color
属性集将下拉列表包装在容器中来更改其背景
之前:
之后:
代码如下:
Container(
padding:
EdgeInsets.symmetric(horizontal: 10, vertical: 5),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10)),
// dropdown below..
child: DropdownButton<String>(
value: dropdownValue,
icon: Icon(Icons.arrow_drop_down),
iconSize: 42,
underline: SizedBox(),
onChanged: (String newValue) {
setState(() {
dropdownValue = newValue;
});
},
items: <String>[
'One',
'Two',
'Three',
'Four'
].map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList()),
)
容器(
衬垫:
边缘组。对称(水平:10,垂直:5),
装饰:盒子装饰(
颜色:颜色,白色,
边界半径:边界半径。圆形(10)),
//下拉列表如下。。
孩子:下拉按钮(
value:dropdownValue,
图标:图标(图标。箭头下拉),
iconSize:42,
下划线:SizedBox(),
onChanged:(字符串newValue){
设置状态(){
dropdownValue=newValue;
});
},
项目:[
"一",,
“两个”,
"三",,
“四”
].map((字符串值){
返回下拉菜单项(
价值:价值,
子项:文本(值),
);
}).toList()),
)
如果希望下拉按钮填充其所在的空间,请使用属性isExpanded
并将其设置为true
DropdownButton<String>(
isExpanded: true,
)
下拉按钮(
是的,
)
在最新版本的颤振中,您可以做一些非常简单的事情
DropdownButton类有一个名为“dropdownColor”的内置变量,可以直接为其指定所需的任何颜色,而无需更改任何“主题数据”。也会自动更改下拉菜单项的颜色。在主题数据中更改画布颜色对我来说很好。将此用于颜色
DropdownButtonFormField(
items: null,
onChanged: null,
dropdownColor: Colors.red,
),
我应该如何在Flatter中自定义DropdownButtons和DropdownMenuItems
Container(
child: DropdownButtonHideUnderline(
child: DropdownButton(
value: _value,
icon: Icon(Icons.arrow_drop_down,color: Colors.white,),
dropdownColor: Colors.redAccent,
iconSize: 22,
items: [
DropdownMenuItem(
child: Text(
Employees by Gender",
style: GoogleFonts.dosis(
fontSize: 10,
color: Colors.black54
),
),
value: 1,
),
DropdownMenuItem(
child: Text(
Employees by Attendance",
style: GoogleFonts.dosis(
fontSize: 10,
color: Colors.black54
),
),
value: 2,
),
],
onChanged: (value) {
setState(() {
_value = value;
});
})),
)
您可以像这样用容器包装它:
return new DropdownButton(
value: ...,
items: ...,
onChanged: ...,
style: new TextStyle(
color: Colors.white,
),
);
Container(
margin: const EdgeInsets.all(15.0),
padding: const EdgeInsets.only(left: 10.0, right: 10.0),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: Colors.white)
),
child: DropdownButton(
dropdownColor: Colors.white,
style: TextStyle(
color: Colors.black,
backgroundColor: Colors.white,
),
value: 'ar',
items: [
DropdownMenuItem(child: Text('English'), value: 'en'),
DropdownMenuItem(child: Text('العربية'), value: 'ar'),
],
),
)
输出:
您知道是否有方法覆盖每个下拉菜单项的填充(左和右)?主题数据没有填充
属性。我尝试将DropdownMenuItem的填充设置为负数,但这是不允许的。谢谢@MaryThemeData
关注的是视觉效果(颜色、文本样式等),而不是定位。我相信您希望在下拉列表中居中显示项目,因此您只需将文本
小部件包装在中心
小部件的答案中。但是,如果需要自定义项目的位置,使其不居中,则需要将文本
小部件包装在行
中,该行
包装在填充
小部件中,然后根据需要自定义填充
属性。您也可以使用容器
替换前面评论中的行
,您将获得相同的结果,如果有任何不清楚的地方,请告诉我。谢谢。直到找到答案,我才明白这一点!谢谢你的解决方案。这似乎是一个问题已经有一段时间了:您也可以在主题中执行data:ThemeData.dark(),
,它将允许您使用白色/黑色下拉列表或data:ThemeData.light()与问题无关。我用容器包装了dropdownbutton,并设置了容器颜色。这与接受答案和其他答案中的解决方案相同。Stackoverflow与github不同。如果一个答案有效,请投票并在评论中提及。这是我正在寻找的最好的例子