You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter中制作带圆形边框的Dropdown(下拉菜单)

Flutter 实现带圆形边框的下拉菜单

你可以通过两种方式实现这种带圆形边框的下拉菜单,以下是具体实现方案:

方案一:使用 DropdownButtonFormField(推荐)

借助DropdownButtonFormField的InputDecoration可以快速配置边框样式,代码示例如下:

import 'package:flutter/material.dart';

class RoundedDropdown extends StatefulWidget {
  const RoundedDropdown({super.key});

  @override
  State<RoundedDropdown> createState() => _RoundedDropdownState();
}

class _RoundedDropdownState extends State<RoundedDropdown> {
  String? selectedValue;
  final List<String> dropdownItems = ['选项1', '选项2', '选项3', '选项4'];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: SizedBox(
          width: 200, // 设置下拉框宽度
          child: DropdownButtonFormField<String>(
            value: selectedValue,
            decoration: InputDecoration(
              filled: true,
              fillColor: Colors.white,
              // 核心:设置圆形边框
              border: OutlineInputBorder(
                borderRadius: BorderRadius.circular(20),
                borderSide: const BorderSide(color: Colors.grey),
              ),
              enabledBorder: OutlineInputBorder(
                borderRadius: BorderRadius.circular(20),
                borderSide: const BorderSide(color: Colors.grey),
              ),
              focusedBorder: OutlineInputBorder(
                borderRadius: BorderRadius.circular(20),
                borderSide: const BorderSide(color: Colors.blue),
              ),
              contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
            ),
            items: dropdownItems.map((item) {
              return DropdownMenuItem(
                value: item,
                child: Text(item),
              );
            }).toList(),
            onChanged: (newValue) {
              setState(() {
                selectedValue = newValue;
              });
            },
            icon: const Icon(Icons.arrow_drop_down),
            iconSize: 24,
          ),
        ),
      ),
    );
  }
}

关键说明:

  • BorderRadius.circular(20):调整数值可以控制圆角的弧度,数值越大边框越圆。
  • enabledBorder和focusedBorder分别配置未聚焦、聚焦状态下的边框样式,保证交互一致性。
  • filled和fillColor设置下拉框的背景色,和示例图的白色背景匹配。

方案二:使用 Container + DropdownButton

如果不想用表单组件,也可以用Container包裹DropdownButton来自定义边框:

import 'package:flutter/material.dart';

class RoundedDropdown extends StatefulWidget {
  const RoundedDropdown({super.key});

  @override
  State<RoundedDropdown> createState() => _RoundedDropdownState();
}

class _RoundedDropdownState extends State<RoundedDropdown> {
  String? selectedValue;
  final List<String> dropdownItems = ['选项1', '选项2', '选项3', '选项4'];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: SizedBox(
          width: 200,
          child: Container(
            padding: const EdgeInsets.symmetric(horizontal: 16),
            decoration: BoxDecoration(
              borderRadius: BorderRadius.circular(20),
              border: Border.all(color: Colors.grey),
              color: Colors.white,
            ),
            child: DropdownButton<String>(
              value: selectedValue,
              underline: const SizedBox(), // 去掉默认下划线
              items: dropdownItems.map((item) {
                return DropdownMenuItem(
                  value: item,
                  child: Text(item),
                );
              }).toList(),
              onChanged: (newValue) {
                setState(() {
                  selectedValue = newValue;
                });
              },
              icon: const Icon(Icons.arrow_drop_down),
              isExpanded: true, // 让下拉按钮占满容器宽度
            ),
          ),
        ),
      ),
    );
  }
}

关键说明:

  • 用Container的decoration属性设置圆形边框和背景色。
  • DropdownButton设置underline: const SizedBox()去掉默认的下划线,isExpanded: true让按钮宽度适配容器。

内容的提问来源于stack exchange,提问作者Ruchira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:28:06