Flutter/Dart:Button on Pressed()已调用,但屏幕未重新绘制



我正试图让一个按钮在按下时更改其文本。我使用setState((来更改传递给按钮的Text子项的字符串的值。我试图更改其文本的按钮是forgetLabel,可以在下面的代码中找到。

我尝试过使用不同的按钮类型,如FlatButton和RaisedButton,所有这些都导致了相同的问题:按钮被按下,setState被调用,并更改表示按钮中文本的字符串的值(在代码中称为forgetText(,但按钮似乎没有发生视觉变化。这是代码:

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

问题是forgotText在调用setState时发生了更改,但由于它被定义为build()中的局部变量,因此它会再次初始化为Forgot Password。使其成为_LoginPageState的实例变量。

最新更新