我正在尝试按下按钮更改其文本 . 我这样做是通过使用setState()来更改传递给按钮的Text子项的字符串的值 . 我试图更改文本的按钮是忘记标签 - 在下面的代码中找到 .
我尝试使用不同的按钮类型,如FlatButton和RaisedButton,所有这些都导致了同样的问题:按下按钮,调用setState并更改表示按钮中文本的字符串的值(在代码中称为forgotText) )但按钮似乎没有在视觉上改变 . 这是代码:
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
],
),
),
);
}
}
1 回答
问题是
forgotText
在调用setState
时被更改,但因为它被定义为build()
内的局部变量,所以它再次被初始化为Forgot Password
. 使其成为_LoginPageState
的实例变量 .