Flutter DropdownButton 颜色与父 Widgets 相同

Posted

技术标签:

【中文标题】Flutter DropdownButton 颜色与父 Widgets 相同【英文标题】:Flutter DropdownButton same color as parent Widgets 【发布时间】:2018-09-30 14:37:51 【问题描述】:

我一直在开发一个玩具提醒应用程序,并希望实现一个下拉菜单供用户选择给定的时间间隔。

我已经加载了按钮,并且可以在弹出正确的菜单时单击它。问题是屏幕上按钮的外观。与父Widget同色,完全不显示选中项的文字。

如何使下拉按钮具有白色背景和黑色文本?

这是截图:

这是构建此视图的代码:

@override
Widget build(BuildContext context) 

return new Container(

  child: new Row(

    children: <Widget>[
      new Expanded(

        child: new Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[

            _buildInformationRow(),
            _buildReminderRow(),

          ],
        )

      )
    ],

  )

  );
 

Widget _buildInformationRow() 

return new Container(
  padding: const EdgeInsets.all(10.0),
  child: new Row(

    children: <Widget>[

      new Column(
        children: <Widget>[

          new Container(
            padding: const EdgeInsets.all(10.0),
            child: new Text(
              "This app can remind you to do stuff\non a regular basis",
                style: new TextStyle(
                  color: Colors.white,
                  fontSize: 18.0,
                )
            ),

          )

        ],
      )

    ],

  ),

);


Widget _buildReminderRow() 

return new Container(

  child: new Row(
    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
    children: <Widget>[

      new Column(
        children: <Widget>[

          new Container(

            child: new Text(
                "Remind me",
                style: new TextStyle(
                  color: Colors.white,
                  fontSize: 18.0,
                )
            ),

          )

        ],
      ),

      new Column(
        children: <Widget>[

          new Container(

              child: new DropdownButton<String>(
                  style: new TextStyle(
                    color: Colors.black,
                    fontSize: 18.0,
                  ),
                  items: <String>["Never", "Daily", "Hourly", "Every 30 Minutes"].map((String value) 
                    return new DropdownMenuItem <String>(
                        value: value,
                        child: new Text(value)
                    );
                  ).toList(),
                  onChanged: null
              )
          )

        ],
      )

    ],
  ),

);

【问题讨论】:

您是否将主题中的多个值设置为相同的颜色? 不,我的主题非常简单:我只是设置了亮度、原色和强调色。 【参考方案1】:

您是否尝试过将 Dropdown 包装在一个白色的容器中,然后只需确保 DropdownButton 样式属性上的子项具有黑色的 TextStyle。

new Container(
    color: Colors.white,
    child: DropdownButtonHideUnderline(
        child: ButtonTheme(
          alignedDropdown: true,
          child: DropdownButton<T>(
            items: dropdownItems,
            onChanged: this.onChanged,
            value: this.preSelected,
            style: new TextStyle(
              color: Colors.black,
            ),
          ),
        )
    ),
  ),

注意:我使用 ButtonTheme 来确保下拉菜单填充容器的宽度。

您还可以将容器包裹在主题周围,以在活动和显示菜单项时更改实际下拉菜单的背景。

new Theme(
    data: Theme.of(context).copyWith(
      canvasColor: Theme.of(context).primaryColor
    ),
    child: // Your Dropdown Code Here,
  ),

【讨论】:

@EdwinLiu OP 希望它是白色背景。不过,使用上述方法,您可以完全自定义下拉菜单的主题,但不会影响应用的主题。 谢谢@AlanNegrete!包装主题是一个很好的解决方案。现在我可以睡个好觉了,今晚!【参考方案2】:
Theme(
  data: new ThemeData(
    canvasColor: Colors.red,
      primaryColor: Colors.black,
      accentColor: Colors.black,
      hintColor: Colors.black),
  child: DropdownButton(
    iconEnabledColor: Colors.white,
    style: TextStyle(color: _selectedColor,fontSize: 16),
    underline: Text(''),
    value: selectedCurrency,
    isExpanded: true,
    iconSize: 40,
    items: currencies.entries
        .map<DropdownMenuItem<String>>(
            (MapEntry<String, String> e) =>
                DropdownMenuItem<String>(
                  value: e.key,
                  child: Text(e.value),
                ))
        .toList(),
    onChanged: (String newKey) 
      setState(() 
        _selectedColor = Colors.white;
        selectedCurrency = newKey;
      );
    ,

  ))

【讨论】:

我用过这个。谢谢!【参考方案3】:

使用提示而不是值

例子

提示:dropdownValue == null ? Text("选择一个", style: TextStyle(color: Colors.red)): Text(dropdownValue, style: TextStyle(color: Colors.green)),

dropdownValue 是我选择的值

【讨论】:

【参考方案4】:

您可以使用以下代码将自定义颜色赋予 DropDownButton 提示

DropdownButton<String>(
      isExpanded: true,
      hint: Text('Your hint',style: TextStyle(color: Color(0xFFF5F5F5)),),
      icon: Icon(Icons.arrow_downward),
      iconSize: 20,
      elevation: 12,
      style: TextStyle(color: Colors.lightBlue),
      underline: Container(
        height: 0,
      ),

      items: _currencies
          .map<DropdownMenuItem<String>>((String value) 
        return DropdownMenuItem<String>(
          value: value,
          child: Text(
            value,
            style: TextStyle(fontSize: 14.0, color: Color(0xFFF5F5F5)),
          ),
        );
      ).toList(),
      onChanged: (String valueSelected) 
        onDropDownItemChanged(valueSelected);
      ,
      value: dropdownValue,
      //00000value: dropdownValue,
    ),

【讨论】:

【参考方案5】:

你可以这样做

DropdownButtonHideUnderline(
                            child: Theme(
                              data: ThemeData(
                                primaryColor: Colors.white,
                              ),
                              child: DropdownButton<String>(
                                isExpanded: true,
                                value: _selectedMetalColor,
                                onChanged: (String newValue) 
                                  setState(() 
                                    _selectedMetalColor = newValue;
                                    //dropdownValue = newValue;
                                  );
                                ,
                                // hint: Text(
                                //   teethMetalColors[0],
                                //   style: TextStyle(
                                //     color: Colors.white,
                                //   ),
                                // ),
                                icon: Container(
                                  margin: EdgeInsets.only(right: 12.0),
                                  child: Icon(
                                    // Add this
                                    Icons.keyboard_arrow_down, // Add this
                                    color: Colors.white, // Add this
                                    size: 35.0,
                                  ),
                                ),
                                style: TextStyle(
                                    color: Colors.black, fontSize: 16.0),
                                selectedItemBuilder:
                                    (BuildContext context) 
                                  return teethMetalColors
                                      .map((String value) 
                                    return Padding(
                                      padding: const EdgeInsets.only(
                                          top: 12.0, left: 16.0),
                                      child: Text(
                                        _selectedMetalColor,
                                        style:
                                            TextStyle(color: Colors.white),
                                      ),
                                    );
                                  ).toList();
                                ,
                                items: teethMetalColors
                                    .map<DropdownMenuItem<String>>(
                                        (String value) 
                                  return DropdownMenuItem<String>(
                                    value: value,
                                    child: Padding(
                                      padding: const EdgeInsets.all(8.0),
                                      child: Text(
                                        value,
                                        style:
                                            TextStyle(color: Colors.black),
                                      ),
                                    ),
                                  );
                                ).toList(),
                              ),
                            ),
                          )

【讨论】:

【参考方案6】:

试试这个,并用主题颜色替换容器的颜色:

 Container(
        padding: const EdgeInsets.only(left: 0.0, right: 10.0),
        decoration: BoxDecoration(
          color: Colors.cyanAccent,
        ),
        child: DropdownButtonHideUnderline(
          child: new DropdownButton<String>(
                  style: new TextStyle(
                    color: Colors.black,
                    fontSize: 18.0,
                  ),
                  items: <String>["Never", "Daily", "Hourly", "Every 30 Minutes"].map((String value) 
                    return new DropdownMenuItem <String>(
                        value: value,
                        child: new Text(value)
                    );
                  ).toList(),
                  onChanged: null
              ),
),
)

【讨论】:

以上是关于Flutter DropdownButton 颜色与父 Widgets 相同的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:按钮下方的 DropDownButton 项

Dart / flutter:DropdownButton在值更改时导致异常

flutter DropdownButton使用

Flutter - 如何在小部件测试中选择 DropdownButton 项

Flutter GetBuilder Dependent DropDownButton - 即使值已被重置,也应该只有一项具有 [DropdownButton] 的值

如何像 Flutter 中的 Spinner 一样在 DropdownButton 下方打开 DropDown 对话框?