Flutter:如何最小化DropdownButton的宽度

ffscu2ro  于 2022-12-14  发布在  Flutter
关注(0)|答案(6)|浏览(268)

Flutter中的DropdownButton根据它所拥有的项目中最大的DropdownMenuItem来设置它的宽度。如果选择了一个小项目,那么在项目和箭头之间会留下很多白色。我该如何使按钮缩放到刚好适合所选项目的宽度呢?
我尝试使用Expanded,一些Flexible的东西,我仍然不能使它改变它的宽度。

DropdownButton(
    value: null,
    hint: Text("Small text"),
    items: ..., //Text widgets that have more text and are larger than the hint
)

我试图去掉hint和箭头之间的空格:

hrirmatl

hrirmatl1#

宽度实际上是由selectedItemBuilder参数提供的最宽项决定的(如果没有定义,它将使用这些项)。

DropdownButton<T>(
      value: value,
      selectedItemBuilder: (ctx) => [for (final item in items) value], 
      items: items,
      onChanged: (value) => ... update value

示例中的selectedItemBuilder生成一个重复项的列表(对应于所选值的项),您需要一个有状态的小部件来处理该值。

gg0vcinb

gg0vcinb2#

ButtonTheme Package 下拉按钮,并添加alignedDropdown = true,如下所示:

ButtonTheme(
  alignedDropdown: true,
  child: DropdownButton(...),
)

alignedDropdown会将菜单项的宽度与按钮相匹配。然后我们需要特定的宽度,所以用SizedBox或Container Package ButtonTheme:

SizedBox(
  width: 25, // Your width for dropdowns
  child: ButtonTheme(...),
)
wqlqzqxt

wqlqzqxt3#

这是可行的:

new Container(
            padding: const EdgeInsets.fromLTRB(10.0, 5, 10, 0),
            child: new Container(
              padding: const EdgeInsets.fromLTRB(10, 5, 5, 5),
              decoration: new BoxDecoration(
                  color: Colors.white,
                  borderRadius: new BorderRadius.only(
                      topLeft: const Radius.circular(5.0),
                      bottomLeft: const Radius.circular(5.0),
                      bottomRight: const Radius.circular(5.0),
                      topRight: const Radius.circular(5.0))),
              child: new Center(
                  child: new Column(children: [
                new DropdownButton(
                  underline: Text(''),
                  icon: Icon(Icons.keyboard_arrow_down),
                  hint: new Text('Small text'),
                  style: TextStyle(
                    color: Colors.white30,
                  ),
                  isExpanded: true,
                  value: _selectedLocation,
                  onChanged: (String newValue) {
                    setState(() {
                      _selectedLocation = newValue;
                    });
                  },
                  items: _locations.map((String location) {
                    return new DropdownMenuItem<String>(
                      value: location,
                      child: new Text(
                        location,
                        style: TextStyle(
                            color: myColour, fontWeight: FontWeight.bold),
                      ),
                    );
                  }).toList(),
                ),
              ])),
            ))
ltskdhd1

ltskdhd14#

如果我理解正确的话,那么我也遇到过这个问题,并且我有一个解决方案。简单地创建一个Wrap小部件作为DropdownButton的父控件。它将使下拉菜单按照值的大小换行(不确定它对空值的React)

Wrap(children: <Widget>[DropdownButton(
value: null,
hint: Text("Small text"),
items: //Text widgets that have more text and are larger than the hint
)])
rqqzpn5f

rqqzpn5f5#

使用DropdownButtonHideUnderline删除下划线扭曲下拉框

1rhkuytd

1rhkuytd6#

我设法通过定义alignment: Alignment.centerRight删除了空白。默认情况下,对齐方式设置为Alignment.centerStart,这将强制文本开始对齐,而图标设置为结束对齐。因此,通过将文本居中向右对齐,它将填充文本和图标之间的空白。完整代码示例:

DropdownButton(
    alignment: Alignment.centerRight,
    child: .....
     )

相关问题