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