我正试图让按钮在按下后变成灰色。我读过如何做这件事。我能找到的最好的方法是用三元运算符设置材料颜色,然后在setState(() {})
块中更改条件:
Container vehicleButton(IconData icon_, String text_, {required Function onClickAction}){
const double buttonSizeX = 200;
const double buttonSizeY = 100;
const double iconSize = 60;
const double buttonTextSize = 15;
const double buttonMargin = 5;
Color buttonColor = const Color(0xff2196f3);
const Color iconColor = Color(0xffffffff);
const Color buttonTextColor = Color(0xffffffff);
bool pressed = false;
return Container(padding: const EdgeInsets.only(left: buttonMargin, right: buttonMargin, top: buttonMargin, bottom: buttonMargin), child: SizedBox.fromSize(
size: Size(buttonSizeX, buttonSizeY), child: Material(color: pressed ? Color.fromARGB(255, 143, 143, 143) : buttonColor, child: InkWell(
onTap: () {
setState(() {
pressed = true;
});
onClickAction();
},
child: Column(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
Icon(icon_, color: iconColor, size: iconSize),
Text(text_, style: TextStyle(fontSize: buttonTextSize, color: buttonTextColor)),
])))));
}
然而,我得到了一个警告,代码之后?在我的三元运算符中是死代码。事实上,按下按钮后不会变成灰色。
我想也许Material的值是最终的,不能改变,但这并不能解释为什么我在互联网上找到的所有例子都使用这种方法。
您有:
Container vehicleButton(...) {
bool pressed = false;
return Container(
...
child: SizedBox.fromSize(
...
child: Material(
color: pressed ? Color.fromARGB(255, 143, 143, 143) : buttonColor,
child: InkWell(
onTap: () {
setState(() {
pressed = true;
});
onClickAction();
},
Dart分析工具正确地报告Color.fromARGB(...)
是死代码,因为条件三元运算符检查局部pressed
变量的状态,在检查时,该变量始终为false
。虽然onTap
处理程序设置了pressed = true
,但它正在设置本地pressed
变量的状态,该变量将永远不会被读取。
您可能希望pressed
成为包含vehicleButton
方法的State
类的成员变量。
我建议您不要使用SizedBox,而是使用flutter dev提供的按钮:https://docs.flutter.dev/release/breaking-changes/buttons
你可以尝试一下:
RaisedButton(
child: new Text('Attention'),
textColor: Colors.white,
color: pressColor ? Colors.grey : Colors.blue, //Choose your personal colors
onPressed: () => setState(() => pressColor = !pressColor), //change the button colors
);