如何在Flutter中为下拉按钮制作圆角边框?

53
如何添加圆角矩形边框? 以下代码在屏幕上没有显示出任何边框。
Container(margin: EdgeInsets.only(top: 10.0, right: 10.0, left: 10.0),
 width: double.infinity,
 // decoration: ShapeDecoration(
 //  shape: RoundedRectangleBorder(
 //   borderRadius:BorderRadius.all(Radius.circular(5.0)),
 //                             ),

 child: DropdownButtonHideUnderline(
  child: Container(
   margin: EdgeInsets.only(
    left: 10.0, right: 10.0),
     child: new DropdownButton<UserTest>(...),
                           ),
                          ),
                   ),

你可以尝试将你的小部件包裹在 ClipRRect 中。 - Andrii Turkovskyi
9个回答

84

使用表单字段变量,您可以使用用于输入文本字段的OutlineInputBorder InputBorder

DropdownButtonFormField(
  ...
  decoration: const InputDecoration(
    border: OutlineInputBorder(),
  ),
),

表单字段的方式可以被复制并用于常规的DropdownButton中:

InputDecorator(
  decoration: const InputDecoration(border: OutlineInputBorder()),
  child: DropdownButtonHideUnderline(
    child: DropdownButton(
      ...
    ),
  ),
),

边框预览


我喜欢这个答案,因为它使用了DropdownButtonFormField,它具有labelText属性,这将在选择某些值后保持输入标签可见,从用户体验的角度来看,这是基本的。 - Nick
1
floatingLabelBehavior在与输入装饰器一起使用时无法正常工作。你知道为什么吗? - Bagus Aji Santoso
我不确定 - 或许检查一下表单字段实现是否有差异? - hacker1024

34

您需要指定 side: 属性。默认情况下,它是 BorderSide.none

      decoration: ShapeDecoration(
        shape: RoundedRectangleBorder(
          side: BorderSide(width: 1.0, style: BorderStyle.solid),
          borderRadius: BorderRadius.all(Radius.circular(5.0)),
        ),
      ),

8
如果我们想要将包含DropDownButtonItem的打开列表窗口四舍五入,该怎么办? - aytunch
@aytunch,你找到你的查询解决方案了吗? - Chirag Mittal
很遗憾,不可以。 - aytunch
1
@aytunch 这是不可能的。您需要构建自己的 DropDownButton 版本。请查看小部件源代码。源代码中的 _DropdownRoute 是无法访问的。 - chemamolins
1
如果您想要移除下拉框的下划线,只需将DropDownButton包装在“DropdownButtonHideUnderline”小部件中即可。 - Jeff S.
@aytunch 和 @Chirag Mittal:现在(2023年)似乎可以通过使用borderRadius参数实现,详见 https://api.flutter.dev/flutter/material/DropdownButton/borderRadius.html - undefined

17

样本输出

Column(
    crossAxisAlignment : CrossAxisAlignment.start,
    children: <Widget> [
        Text('Gender:'),
        InputDecorator(
            decoration: InputDecoration(
                border: OutlineInputBorder(borderRadius: const BorderRadius.all(Radius.circular(4.0)),
                contentPadding: EdgeInsets.all(10),
            ),
            child: DropdownButtonHideUnderline(
                child: DropdownButton<String>(
                    value: gender,
                    isDense: true,
                    isExpanded: true,
                    items: [
                        DropdownMenuItem(child: Text("Select Gender"), value: ""),
                        DropdownMenuItem(child: Text("Male"), value: "Male"),
                        DropdownMenuItem(child: Text("Female"), value: "Female"),
                    ],
                    onChanged: (newValue) {
                        setState(() {
                        });
                    },
                ),
            ),
        ),
    ]
),

但是当选择一个项目时,背景颜色没有完全覆盖宽度和高度。 - e-info128

16
如果你想要的是这个...

enter image description here

然后这里你去{{这里是内容}}。
    import 'package:flutter/material.dart';

class RoundedBorderDropdown extends StatelessWidget {
  final List<String> _dropdownValues = [
    "One",
    "Two",
    "Three",
    "Four",
    "Five"
  ]; //The list of values we want on the dropdown

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Rounded Border Button in AppBar'),
      ),
      body: Center(
        child: Container(
          padding: EdgeInsets.symmetric(horizontal: 10.0),
          decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(15.0),
            border: Border.all(
                color: Colors.red, style: BorderStyle.solid, width: 0.80),
          ),
          child: DropdownButton(
            items: _dropdownValues
                .map((value) => DropdownMenuItem(
                      child: Text(value),
                      value: value,
                    ))
                .toList(),
            onChanged: (String value) {},
            isExpanded: false,
            value: _dropdownValues.first,
          ),
        ),
      ),
    );
  }
}

这是礼貌 inducesmile

愉快的编码...


4
在“DropdownButton”中添加“underline: SizedBox.shrink()”以去除下划线。 - Tushar Sadhwani

2
你可以尝试使用这个。
 Container(
                                  padding: EdgeInsets.symmetric(horizontal: 5),
                                  decoration: BoxDecoration(
                                    border: Border.all(color: Colors.blueGrey),
                                    borderRadius: BorderRadius.circular(5),
                                  ),
                                  child: DropdownButtonHideUnderline(
                                    child: DropdownButton<String>(
                                      borderRadius: BorderRadius.circular(12),
                                      isExpanded: true,
                                      items: <String>[
                                        '1 km',
                                        '2 km',
                                        '3 km',
                                        '4 km',
                                        '5 km'
                                      ].map((String value) {
                                        return DropdownMenuItem<String>(
                                          value: value,
                                          child: Text(value),
                                        );
                                      }).toList(),
                                      hint:
                                          ourtext("Select area", fontSize: 14),
                                      onChanged: (_) {},
                                    ),
                                  ),
                                ),

1
Container(width: 200.0,
          height: 50.0,
          decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(7.0),
          border: Border.all(color: Colors.blueGrey)),
                         child: DropdownButton<String>(
                         hint: Text("Messaging"),
                         items: <String>['Messaging', 'Chating', 'No Longer Interested', 'Document Request'].map((String value) {
                            return new DropdownMenuItem<String>(
                              value: value,
                              child: new Text(value),
                            );
                          }).toList(),
                          onChanged: (_) {},
                      ),
                      )

0

字符串 selectedValue

String selected value;

Widget createRoundedDropDown (){
  return Container(
  decoration: BoxDecoration(
    color: Colors.white,
    border: Border.all(),
    borderRadius: BorderRadius.circular(20),
  ),
  child: Padding(
    padding: const EdgeInsets.all(5.0),
    child: DropdownButtonHideUnderline(
      child: DropdownButton<String>(
        borderRadius: BorderRadius.circular(10),
        style: TextStyle(color: Colors.black,fontSize: 14,),
        hint: Text("hint text"),
        value: selectedValue,
        isDense: true,
        onChanged: (newValue) {
          setState(() {
            selectedValue = newValue;
          });
        },
        items: listItems.map((document)  {
          return DropdownMenuItem<String>(
            value: document.name,
            child: FittedBox(fit:BoxFit.fitWidth,
                child: Text(document.name,
                       style:TextStyle(fontSize: 16))),
            );
        }).toList(),
      ),
    ),
  ),
);}

0

如果您想为菜单本身制作圆角,请在DropdownButton中添加borderRadius属性:

DropdownButton(
  borderRadius:BorderRadius.circular(12),
  items: ...
)

0
将其包装在一个 Material 中并移除 DropDown 边框。
Material(
    borderRadius: BorderRadius.circular(40),
    child: SizedBox(
      width: MediaQuery.of(context).size.width / 1.08,
      child: DropdownButton(
        style: style.copyWith(color: Colors.black),
        isExpanded: true,
        underline: DropdownButtonHideUnderline(child: Container()),
        value: value,
        items: ...
   
    ),
  )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接