Flutterでは、DropdownButtonのアイコン(下矢印アイコン)の色を白色に変更しようとしています。
仕方なくstyleプロパティを使ってみました。テキストの色は白になりましたが、アイコンはデフォルトの灰色のままです。
DropdownButton(
style: TextStyle(color: Colors.white, decorationColor:
Colors.white),
items: this.items,
value: null,
hint: Text(SaveOptions[_saveOption], style: TextStyle(color:
Colors.white)),
onChanged: (selectedOption) {
setState(() {
_saveOption = selectedOption;
});
})
矢印アイコンの色を白に変更するにはどうすればよいですか?
DropdownButton
は最も近いTheme
から色を取得するため、2つのオプションがあります。
1つ目は、アプリケーションテーマの明るさを変更することです。
そしてもう1つは、dropdown
ボタンを新しいTheme
で暗いbrightness
でラップすることです。
Theme(
data: Theme.of(context).copyWith(brightness: Brightness.dark),
child: DropdownButton(
style: TextStyle(color: Colors.white, decorationColor: Colors.white),
items: this.items,
value: null,
hint: Text(SaveOptions[_saveOption], style: TextStyle(color: Colors.white)),
onChanged: (selectedOption) {
setState(() {
_saveOption = selectedOption;
});
},
),
)
フィールドiconEnabledColor
およびiconDisabledColor
は、次の方法で使用できます。
final myDropDownMenu = DropdownButton<String>(
iconEnabledColor: Colors.white,
iconDisabledColor: Colors.white,
value: myInitialValue,
// The rest of your code
);
これは少しハックですが、ドロップダウンがどのように折りたたまれているかを完全に制御できます。つまり、make値:null、ヒント:null、iconsize:null、同じサイズの2つのコンテナーを持つスタックを作成します。折りたたまれたドロップダウンと、ジェスチャーを「拡張」する1。
class MyDropdownFilled extends StatefulWidget {
final List<String> dropDownValues;
const MyDropdownFilled({Key key, @required this.dropDownValues})
: super(key: key);
List<DropdownMenuItem<String>> getDropDownMenuItems() {
return dropDownValues
.map((itemString) =>
DropdownMenuItem(child: Text(itemString), value: itemString))
.toList();
}
@override
_MyDropdownFilledState createState() => _MyDropdownFilledState();
}
class _MyDropdownFilledState extends State<MyDropdownFilled> {
String _activeDropdown;
@override
initState() {
super.initState();
_activeDropdown = widget.dropDownValues[0];
}
@override
Widget build(BuildContext context) {
return Stack(
children: [
Container(
width: double.infinity,
padding: EdgeInsets.all(10.0),
decoration: BoxDecoration(
color: primaryColor.shade600,
borderRadius: BorderRadius.all(Radius.circular(2))),
child:
Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
Text(_activeDropdown, style: Theme.of(context).textTheme.caption),
Icon(Icons.arrow_drop_down, size: 30, color: Colors.white),
]),
),
Container(
width: double.infinity,
padding: EdgeInsets.all(10.0),
decoration: BoxDecoration(
color: Colors.transparent,
borderRadius: BorderRadius.all(Radius.circular(2))),
child: DropdownButtonHideUnderline(
child: DropdownButton<String>(
value: null,
isDense: true,
iconSize: 0,
hint: null,
onChanged: (String newValue) {
setState(() {
_activeDropdown = newValue;
});
},
items: widget.dropDownValues.map((String value) {
return DropdownMenuItem(
value: value,
child: Text(value),
);
}).toList(),
)),
)
],
);
}
}
現在、矢印の色はDropdownButton
にハードコードされています:
Color get _downArrowColor {
// These colors are not defined in the Material Design spec.
if (_enabled) {
if (Theme.of(context).brightness == Brightness.light) {
return Colors.grey.shade700;
} else {
return Colors.white70;
}
} else {
if (Theme.of(context).brightness == Brightness.light) {
return Colors.grey.shade400;
} else {
return Colors.white10;
}
}
}
独自のウィジェットを作成して、このプロパティをカスタマイズできます。
Flutterにはこれを行う方法があるはずですが、現在は可能ではないと思います。これを処理するために私がしたことは、「値」をnullに設定し、「iconSize」を0に設定し、選択されたものに基づいて「ヒント」を動的に生成させることでした。これを行うと、ヒントウィジェットを完全に制御できます。
DropdownButton<int>(
value: null,
iconSize: 0,
hint: Row(
children: <Widget>[
Text(_selected,
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w700,
),
),
Padding(
padding: EdgeInsets.only(left: 5),
child: Icon(
FontAwesomeIcons.caretDown,
color: Colors.white,
size: 20,
),
),
],
),
items: dateRanges.map((Map<String, dynamic> value) {
return DropdownMenuItem<int>(
value: value['type'],
child: Text(
value['name'],
style: TextStyle(
color: Colors.grey[800],
fontWeight: FontWeight.w700,
),
),
);
}).toList(),
onChanged: (type) => _onDateRangeTypeChanged(type),
)
お役に立てれば。
DropdownButtonクラスに移動このコードを編集
if (!DropdownButtonHideUnderline.at(context)) {
final double bottom = widget.isDense ? 0.0 : 8.0;
result = Stack(
children: <Widget>[
result,
Positioned(
left: 0.0,
right: 0.0,
bottom: bottom,
child: Container(
height: 1.0,
decoration: const BoxDecoration(
border: Border(bottom: BorderSide(color: Color(0xFFBDBDBD), width: 0.0))
),
),
),
],
);
}
これに
if (!DropdownButtonHideUnderline.at(context)) {
final double bottom = widget.isDense ? 0.0 : 8.0;
result = Stack(
children: <Widget>[
result,
Positioned(
left: 0.0,
right: 0.0,
bottom: bottom,
child: Container(
height: 1.0,
decoration: const BoxDecoration(
border: Border(bottom: BorderSide(color: Colors.red
(「ここにあなたが欲しい色」)
, width: 0.0))
),
),
),
],
);
}
ソースコードに移動して、テーマに使用されている色を確認できる場合は、設定したい値を持つ新しいテーマをウィジェットで囲みます。