flutter 下拉菜单边框

f3temu5u  于 2022-12-30  发布在  Flutter
关注(0)|答案(1)|浏览(157)

我想给予下拉按钮和下拉菜单的边框,如下图所示沿着高度itemHeight为21px,鼠标悬停和键盘上的向上或向下键的下拉菜单项的一些背景颜色:

以下是我到目前为止所做的尝试:

var genderList = [
    'Female',
    'Male',
    'Other',
  ];

  String? selection;

  final border = const OutlineInputBorder(
    borderSide: BorderSide(
      width: 1,
      color: Color(0xFF00AFEF),
    ),
    borderRadius: BorderRadius.all(Radius.circular(7)),
  );
...
                    SizedBox(
                      height: 38.h,
                      // color: Colors.blue,
                      child: InputDecorator(
                        decoration: InputDecoration(
                          contentPadding: EdgeInsets.zero,
                          border: border,
                          enabledBorder: border,
                        ),
                        child: DropdownButtonHideUnderline(
                          child: DropdownButton(
                            isExpanded: true,
                            hint: Align(
                              alignment: Alignment.centerLeft,
                              child: Padding(
                                padding: EdgeInsets.symmetric(horizontal: 13.w),
                                child: const Text(
                                  'Gender',
                                  style: TextStyle(
                                    fontSize: 14,
                                    color: Color(0xFF606060),
                                  ),
                                ),
                              ),
                            ),
                            value: selection,
                            icon: Container(
                              margin: EdgeInsets.symmetric(horizontal: 13.w),
                              height: 10.r,
                              width: 16.r,
                              alignment: Alignment.center,
                              child: SvgPicture.asset(
                                AppIcons.arrowDown,
                              ),
                            ),
                            onChanged: (String? val) {
                              setState(() => selection = val);
                            },
                            items: genderList.map((option) {
                              return DropdownMenuItem(
                                value: option,
                                child: Container(
                                  width: double.infinity,
                                  height: 21.h,
                                  alignment: Alignment.center,
                                  decoration: BoxDecoration(
                                      color: Color(0xFFCBF1FF),
                                      border: Border.all(
                                          color: Color(0xFF00AFEF), width: 1)),
                                  child: Text(
                                    option,
                                    style: TextStyle(
                                      fontSize: 12,
                                      color: Color(0xFF606060),
                                    ),
                                  ),
                                ),
                              );
                            }).toList(),
                            selectedItemBuilder: (con) {
                              return genderList.map((val) {
                                return Align(
                                  alignment: Alignment.centerLeft,
                                  child: Padding(
                                    padding: EdgeInsets.only(left: 13.w),
                                    child: Text(
                                      val,
                                      textAlign: TextAlign.center,
                                      style: const TextStyle(
                                        fontSize: 14,
                                        color: Color(0xFF606060),
                                      ),
                                    ),
                                  ),
                                );
                              }).toList();
                            },
                          ),
                        ),
                      ),
                    );

我得到的,
下拉按钮:

下拉菜单:

我怎样才能得到想要的设计?

q3qa4bjr

q3qa4bjr1#

我能够使用dropdown_button2获得所需的结果
您可以使用dropdownXXXX参数来编辑相关的下拉菜单属性。
我发现的唯一问题是,当给下拉菜单边框一些半径时,它会被selectedItemHighlightColor覆盖。所以我使用了一些填充来克服它。

SizedBox(
      height: 38,
      child: InputDecorator(
        decoration: InputDecoration(
          contentPadding: EdgeInsets.zero,
          border: border,
          enabledBorder: border,
        ),
        child: DropdownButtonHideUnderline(
          child: DropdownButton2(
            selectedItemHighlightColor: AppColors.lightBackground,
            itemHighlightColor: AppColors.lightBackground,
            dropdownDecoration: BoxDecoration(
              border: Border.all(
                color: AppColors.primary,
                width: 1,
              ),
              borderRadius: BorderRadius.circular(4),
            ),
            dropdownElevation: 0,
            dropdownPadding: const EdgeInsets.symmetric(
              horizontal: 1.5,
              vertical: 1.5,
            ),
            itemPadding: EdgeInsets.zero,
            customItemsHeights: [21, 21, 21],
            isExpanded: true,
            hint: const Padding(
              padding: EdgeInsets.symmetric(horizontal: 14),
              child: Text(
                'Gender',
                style: TextStyle(
                  fontSize: 14,
                  color: AppColors.secondaryText,
                ),
              ),
            ),
            value: widget.value,
            icon: Container(
              margin: const EdgeInsets.symmetric(horizontal: 14),
              height: 10,
              width: 16,
              alignment: Alignment.center,
              child: SvgPicture.asset(
                AppIcons.arrowDown,
              ),
            ),
            onChanged: widget.onChanged,
            items: widget.list.map((option) {
              return DropdownMenuItem(
                value: option,
                child: Container(
                  width: double.infinity,
                  padding: const EdgeInsets.symmetric(horizontal: 14),
                  child: Text(
                    option,
                    style: const TextStyle(
                      fontSize: 12,
                      fontWeight: FontWeight.w500,
                      color: AppColors.secondaryText,
                    ),
                  ),
                ),
              );
            }).toList(),
            selectedItemBuilder: (con) {
              return widget.list.map((val) {
                return Align(
                  alignment: Alignment.centerLeft,
                  child: Padding(
                    padding: const EdgeInsets.only(left: 14),
                    child: Text(
                      val,
                      textAlign: TextAlign.center,
                      style: const TextStyle(
                        fontSize: 14,
                        color: AppColors.secondaryText,
                      ),
                    ),
                  ),
                );
              }).toList();
            },
          ),
        ),
      ),
    );

相关问题