当用户按下onTapDown()和onTapUP(在GestureDetector中)时,我想更新我的MaterialButton。但我无法做到这一点。我试过但没有成功。我在控制台中打印了一些信息,以检查我的代码是否正常工作,但成功完成所有工作而不更新我的MaterialButton小部件。请帮帮我一些代码如下: -
(此代码用于具有可变背景图像的按钮)。
Container(
color: Colors.amber,
alignment: Alignment.center,
padding: EdgeInsets.only(top: 15, bottom: 10),
child: Text(
"CALL FUNTIONS",
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
),
)),
Container(
padding: EdgeInsets.only(bottom: 10),
color: Colors.amber,
child: callFunctionsForLessThan600Pixel(),
),
Widget callFunctionsForLessThan600Pixel() {
return new Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
lessThan600Pixel(Key("LockCallButton"),"button_default","locked"),
lessThan600Pixel(Key("UnLockCallButton"),"button_default","unlocked"),
lessThan600Pixel(Key("StatusCallButton"),"button_default","info"),
],
),
],
);
}
Widget lessThan600Pixel(Key key, String buttonName, String svgName) {
return MaterialButton(
key: key,
child: ConstrainedBox(
constraints: BoxConstraints(
maxHeight: 70,
maxWidth: 70,
),
child: GestureDetector(
child: Stack(
children: <Widget>[
Image.asset("assets/images/$buttonName.png",),
SvgPicture.asset(
"assets/images/$svgName.svg",
height: 30,
width: 30,
color: Colors.white,
),
],
alignment: Alignment.center,
),
onTapDown: (v) {
buttonTappedDown(key, svgName);
},
onTapUp: (v) {
buttonTappedDown(key, svgName);
},
),
),
onPressed: buttonPressed,
elevation: 0,
highlightElevation: 0,
highlightColor: Colors.amber,
);
}
void buttonTappedDown(Key key, String svgName) {
setState(() {
lessThan600Pixel(key, "button_pressed", svgName);
});
}
void buttonTappedUp(Key key, String svgName) {
setState(() {
lessThan600Pixel(key, "button_default", svgName);
});
}
要拥有交互式UI,您需要将窗口小部件类设置为有状态,并且在onPressed函数上,您只需使用setState()方法执行任何更改。通过这种方式,小部件知道必须刷新。
如果您的小部件是无状态的,它将永远不会更新。
以下是谷歌的入门教程,它教你良好的有状态逻辑:qazxsw poi