Drop down menu 我应该如何在Flatter中自定义DropdownButtons和DropdownMenuItems?

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,

DropdownMenuItems的默认值返回浅灰色下拉列表。我应该如何自定义下拉列表(例如背景色、下拉列表宽度)?我可以更改DropdownButton和DropdownMenuItem中的
样式
属性,如下所示:

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的填充设置为负数,但这是不允许的。谢谢@Mary
ThemeData
关注的是视觉效果(颜色、文本样式等),而不是定位。我相信您希望在下拉列表中居中显示项目,因此您只需将
文本
小部件包装在
中心
小部件的答案中。但是,如果需要自定义项目的位置,使其不居中,则需要将
文本
小部件包装在
中,该行
包装在
填充
小部件中,然后根据需要自定义
填充
属性。您也可以使用
容器
替换前面评论中的
,您将获得相同的结果,如果有任何不清楚的地方,请告诉我。谢谢。直到找到答案,我才明白这一点!谢谢你的解决方案。这似乎是一个问题已经有一段时间了:您也可以在主题中执行
data:ThemeData.dark(),
,它将允许您使用白色/黑色下拉列表或data:ThemeData.light()与问题无关。我用容器包装了dropdownbutton,并设置了容器颜色。这与接受答案和其他答案中的解决方案相同。Stackoverflow与github不同。如果一个答案有效,请投票并在评论中提及。这是我正在寻找的最好的例子