Flutter 更新现有StatefulWidget类';飘动中的小部件

Flutter 更新现有StatefulWidget类';飘动中的小部件,flutter,flutter-layout,Flutter,Flutter Layout,当用户按下onTapDown()和onTapUP(在GestureDetector内)时,我想更新我的MaterialButton。但我不能这样做。我试过了,但没有成功。我在控制台中打印了一些信息来检查我的代码是否正常工作,但在不更新MaterialButton小部件的情况下成功地完成了所有工作。请帮帮我 我的一些代码如下:- (此代码用于具有可变背景图像的按钮) 容器( 颜色:颜色。琥珀色, 对齐:对齐.center, 填充:仅限边缘设置(顶部:15,底部:10), 子:文本( “呼叫功能”,

当用户按下onTapDown()和onTapUP(在GestureDetector内)时,我想更新我的MaterialButton。但我不能这样做。我试过了,但没有成功。我在控制台中打印了一些信息来检查我的代码是否正常工作,但在不更新MaterialButton小部件的情况下成功地完成了所有工作。请帮帮我 我的一些代码如下:-

(此代码用于具有可变背景图像的按钮)

容器(
颜色:颜色。琥珀色,
对齐:对齐.center,
填充:仅限边缘设置(顶部:15,底部:10),
子:文本(
“呼叫功能”,
样式:TextStyle(
尺寸:25,
fontWeight:fontWeight.bold,
),
)),
容器(
填充:仅限边缘设置(底部:10),
颜色:颜色。琥珀色,
子级:调用函数小于600像素(),
),
小部件调用函数小于600像素(){
返回新列(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
划船(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
小于600像素(按键(“锁定按钮”)、“默认按钮”、“锁定”),
小于600像素(按键(“解锁按钮”)、“默认按钮”、“解锁”),
小于600像素(按键(“StatusCallButton”)、“默认按钮”、“信息”),
],
),
],
);
}
小部件小于600像素(按键、字符串按钮名称、字符串svgName){
返回物料按钮(
钥匙:钥匙,
子:约束框(
约束:BoxConstraints(
最大高度:70,
最大宽度:70,
),
儿童:手势检测器(
子:堆栈(
儿童:[
Image.asset(“assets/images/$buttonName.png”,),
SvgPicture.asset(
“资产/图像/$svgName.svg”,
身高:30,
宽度:30,
颜色:颜色,白色,
),
],
对齐:对齐.center,
),
onTapDown:(v){
按钮外观向下(键,svgName);
},
onTapUp:(v){
按钮外观向下(键,svgName);
},
),
),
按下:按钮按下,
海拔:0,
Highlight标高:0,
highlightColor:Colors.amber,
);
}
void buttonappeddown(键、字符串svgName){
设置状态(){
小于600像素(按键“按下”,svgName);
});
}
void buttonappedup(键、字符串svgName){
设置状态(){
小于600像素(按键“默认”,svgName);
});
}

要拥有交互式UI,您需要将小部件类设置为有状态,并且在onPressed函数上,您只需使用setState()方法来执行任何更改。 通过这种方式,小部件知道必须刷新

如果您的小部件是无状态的,它将永远不会更新

下面是Goolge的简介教程,它很好地教会了您Statefull逻辑:

我的所有代码如下:-
进口“包装:颤振/材料.省道”;
导入“package:flatter_svg/flatter_svg.dart”;
类FirstPage扩展StatefulWidget{
@凌驾
_FirstPageState createState();
}
类_FirstPageState扩展了状态{
屏幕宽度;
var isMobile;
var scaffoldKey=GlobalKey();
bool-isTap=false;
@凌驾
小部件构建(构建上下文){
isMobile=MediaQuery
.of(上下文)
.尺寸
.宽度<600;
screenWidth=MediaQuery
.of(上下文)
.尺寸
.宽度;
返回脚手架(
钥匙:脚手架钥匙,
背景颜色:颜色。琥珀色[300],
appBar:appBar(
标题:文本(“主页”),
),
正文:SingleChildScrollView(
子:容器(
子:列(
儿童:[
容器(
颜色:颜色。琥珀色,
对齐:对齐.center,
填充:仅限边缘设置(顶部:15,底部:10),
子:文本(
“呼叫功能”,
样式:TextStyle(
尺寸:25,
fontWeight:fontWeight.bold,
),
)),
容器(
填充:仅限边缘设置(底部:10),
颜色:颜色。琥珀色,
子级:调用函数小于600像素(),
),
容器(
颜色:颜色。琥珀色,
对齐:对齐.center,
页边距:仅限边集(顶部:8),
填充:仅限边缘设置(顶部:15,底部:10),
子:文本(
“短信功能”,
样式:TextStyle(
尺寸:25,
fontWeight:fontWeight.bold,
),
)),
],
),
),
),
);
}
小部件调用函数小于600像素(){
返回新列(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
划船(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
小于600像素(按键(“锁定按钮”)、“默认按钮”、“锁定”),
小于600像素(
按键(“解锁按钮”),“默认按钮”,“解锁”),
小于600像素(按键(“StatusCallButton”)、“默认按钮”、“信息”),
],
),
],
);
}
void buttonappeddown(键、字符串svgName){
设置状态(){
小于600像素(按键“按下”,svgName);
});
}
void buttonappedup(键、字符串svgName){
设置状态(){
小于600像素(按键“默认”,svgName);
});
}
小部件小于600像素(按键、字符串按钮名称、字符串svgName){
返回物料按钮(
钥匙:钥匙,
子:约束框(
约束:BoxConstraints(
最大高度:70,
最大宽度:70,
),
儿童:手势检测器(
子:堆栈(
儿童:[
Image.asset(“assets/images/$buttonName.png”,),
SvgPicture.asset(
“资产/图像/$svgName.svg”,
身高:30,
宽度:30,
颜色:颜色,白色,
),
],
对齐:对齐.center,
),
onTapDown:(v)
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);
});
}
My all code are below:-


import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';

class FirstPage extends StatefulWidget {
@override
_FirstPageState createState() => _FirstPageState();
}

class _FirstPageState extends State<FirstPage> {
var screenWidth;
var isMobile;
var scaffoldKey = GlobalKey<ScaffoldState>();
bool isTap = false;


@override
Widget build(BuildContext context) {
isMobile = MediaQuery
    .of(context)
    .size
    .width < 600;
screenWidth = MediaQuery
    .of(context)
    .size
    .width;

return Scaffold(
  key: scaffoldKey,
  backgroundColor: Colors.amber[300],
  appBar: AppBar(
    title: Text("Home Page"),
  ),
  body: SingleChildScrollView(
    child: Container(
      child: Column(
        children: <Widget>[
          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(),
          ),
          Container(
              color: Colors.amber,
              alignment: Alignment.center,
              margin: EdgeInsets.only(top: 8),
              padding: EdgeInsets.only(top: 15, bottom: 10),
              child: Text(
                "SMS FUNTIONS",
                style: TextStyle(
                  fontSize: 25,
                  fontWeight: FontWeight.bold,
                ),
              )),
        ],
      ),
    ),
  ),
  );
  }


 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"),
      ],
    ),
  ],
 );
 }

 void buttonTappedDown(Key key, String svgName) {
 setState(() {
  lessThan600Pixel(key, "button_pressed", svgName);
 });
 }

void buttonTappedUp(Key key, String svgName) {
setState(() {
  lessThan600Pixel(key, "button_default", svgName);
});
}

 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);
      },
    ),
  ),
  elevation: 0,
  highlightElevation: 0,
  highlightColor: Colors.amber,
);
}
}