Android 颤振/飞镖:按钮已按下(),但屏幕未重新绘制?
我试图让一个按钮在按下时更改其文本。我通过使用setState()更改传递给按钮文本子级的字符串的值来完成此操作。我试图更改文本的按钮是forgotLabel-可在下面的代码中找到 我尝试过使用不同的按钮类型,如FlatButton和RaisedButton,所有这些类型都导致了相同的问题:按钮被按下,setState被调用,并更改表示按钮中文本的字符串的值(代码中称为forgotText),但按钮在视觉上没有变化。代码如下:Android 颤振/飞镖:按钮已按下(),但屏幕未重新绘制?,android,button,dart,flutter,Android,Button,Dart,Flutter,我试图让一个按钮在按下时更改其文本。我通过使用setState()更改传递给按钮文本子级的字符串的值来完成此操作。我试图更改文本的按钮是forgotLabel-可在下面的代码中找到 我尝试过使用不同的按钮类型,如FlatButton和RaisedButton,所有这些类型都导致了相同的问题:按钮被按下,setState被调用,并更改表示按钮中文本的字符串的值(代码中称为forgotText),但按钮在视觉上没有变化。代码如下: import 'package:flutter/material.d
import 'package:flutter/material.dart';
import 'package:mobileapp/home_page.dart';
class LoginPage extends StatefulWidget {
static String tag = 'login-page';
@override
_LoginPageState createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
@override
Widget build(BuildContext context) {
final bgGrey = Color(0xFF1c232c);
//Company logo at top
final logo = Hero(
tag: 'hero',
child: CircleAvatar(
backgroundColor: Colors.transparent,
radius:68.0,
child: Image.asset('assets/logo_transparent.png'),
),
);
//Email field
final email = TextFormField(
keyboardType: TextInputType.emailAddress,
autofocus: false,
initialValue: 'jonDoe@domain.com', //remove later
style: TextStyle(color: Colors.white70),
decoration: InputDecoration(
hintText: 'Email',
contentPadding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(32.0),
borderSide: BorderSide(color: Colors.white)
)
),
);
//Password field
final password = TextFormField(
autofocus: false,
initialValue: 'verysafePassword', //remove later
obscureText: true,
style: TextStyle(color: Colors.white70),
decoration: InputDecoration(
hintText: 'Password',
contentPadding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(32.0),
borderSide: BorderSide(color: Colors.white)
)
),
);
// Login button
final loginButton = Padding(
padding: EdgeInsets.symmetric(vertical: 20.0),
child: Material(
borderRadius: BorderRadius.circular(30.0),
color: Colors.deepOrangeAccent,
shadowColor: Colors.deepOrange[300],
elevation: 5.0,
child: MaterialButton(
minWidth: 200.0,
height: 30.0,
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => HomePage()),
);
},
child: Text('Login', style: TextStyle(color: Colors.white70),),
),
)
);
String forgotText = "Forgot Password";
void changeText() {
setState(() =>forgotText = "Please use the web app to reset your password.");
}
// Forgot password button
final forgotLabel = MaterialButton(
child: Text(
forgotText,
style: TextStyle(color: Colors.white70),
),
onPressed: changeText,
);
//Layout settings for each widget made
//Contains: logo, email, password, loginButton and forgotLabel
return Scaffold(
backgroundColor: bgGrey, //defined under method declaration
body: Center(
child: ListView(
shrinkWrap: true,
padding: EdgeInsets.only(left: 24.0, right: 24.0),
children: <Widget>[
logo,
SizedBox(height: 48.0),
email,
SizedBox(height: 8.0),
password,
SizedBox(height: 25.0),
loginButton,
forgotLabel
],
),
),
);
}
}
导入“包装:颤振/材料.省道”;
导入“package:mobileapp/home_page.dart”;
类LoginPage扩展StatefulWidget{
静态字符串标记='登录页面';
@凌驾
_LoginPagentate createState()=>_LoginPagentate();
}
类_loginpagentate扩展状态{
@凌驾
小部件构建(构建上下文){
最终BG格雷=颜色(0xFF1c232c);
//顶部有公司标志
最终标志=英雄(
标签:“英雄”,
孩子:圆环星(
背景颜色:颜色。透明,
半径:68.0,
子项:Image.asset('assets/logo_transparent.png'),
),
);
//电子邮件字段
最终电子邮件=TextFormField(
键盘类型:TextInputType.emailAddress,
自动对焦:错误,
初始值:'jonDoe@domain.com“,//稍后删除
样式:TextStyle(颜色:Colors.white70),
装饰:输入装饰(
hintText:“电子邮件”,
内容填充:来自LTRB(20.0,10.0,20.0,10.0)的EdgeInsets,
enabledBorder:OutlineInputBorder(
边界半径:边界半径。圆形(32.0),
borderSide:borderSide(颜色:Colors.white)
)
),
);
//密码字段
最终密码=TextFormField(
自动对焦:错误,
initialValue:'verysafePassword',//稍后删除
蒙昧文字:对,
样式:TextStyle(颜色:Colors.white70),
装饰:输入装饰(
hintText:'密码',
内容填充:来自LTRB(20.0,10.0,20.0,10.0)的EdgeInsets,
enabledBorder:OutlineInputBorder(
边界半径:边界半径。圆形(32.0),
borderSide:borderSide(颜色:Colors.white)
)
),
);
//登录按钮
最终登录按钮=填充(
填充:边缘组。对称(垂直:20.0),
儿童:材料(
边界半径:边界半径。圆形(30.0),
颜色:Colors.deeporangeacent,
阴影颜色:颜色。深橙色[300],
标高:5.0,
子:材质按钮(
最小宽度:200.0,
身高:30.0,
已按下:(){
导航器。推(
上下文
MaterialPackageRoute(生成器:(上下文)=>HomePage()),
);
},
子项:文本('Login',样式:TextStyle(颜色:Colors.white70),),
),
)
);
字符串forgotText=“忘记密码”;
void changeText(){
setState(()=>forgotText=“请使用web应用程序重置密码。”);
}
//忘记密码按钮
最终锻件标签=材料按钮(
子:文本(
忘了,
样式:TextStyle(颜色:Colors.white70),
),
onPressed:changeText,
);
//每个小部件的布局设置
//包含:徽标、电子邮件、密码、登录按钮和放弃标签
返回脚手架(
backgroundColor:bgGrey,//在方法声明下定义
正文:中(
子:ListView(
收缩膜:对,
填充:仅限边设置(左:24.0,右:24.0),
儿童:[
标志
尺寸箱(高度:48.0),
电子邮件
尺寸箱(高度:8.0),
暗语
尺寸箱(高度:25.0),
登录按钮,
放弃标签
],
),
),
);
}
}
问题是调用setState
时更改了forgotText
,但由于它在build()
中定义为局部变量,因此它再次初始化为忘记密码。将其作为\u loginpagentate
的实例变量 定义-String forgotText=“忘记密码”;构建方法之外-