我有一个注册页面,其中有3个输入字段,在下一个按钮上,我需要更改输入字段并显示另一个字段,因此我仅使用布尔值来显示/隐藏输入。但是,当我单击按钮时,它没有更改字段(均值将布尔值更改为false / true),甚至我只是尝试简单地添加打印,所以我可以检查但它甚至不打印值。但是,如果我使用导航器来更改页面,则其在按钮中的工作状态会很好。
我的代码
class Body extends StatefulWidget {
@override
_BodyState createState() => _BodyState();
}
class _BodyState extends State<Body> {
bool first = true;
bool second = false;
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return Background(
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
"SIGNUP",
style: TextStyle(fontWeight: FontWeight.bold),
),
SizedBox(height: size.height * 0.03),
SvgPicture.asset(
"assets/icons/signup.svg",
height: size.height * 0.35,
),
first ? RoundedInputField(
hintText: "Your Name",
icon: Icons.person,
onChanged: (value) {},
) : Container(),
first ? RoundedInputField(
hintText: "Your Email",
icon: Icons.mail,
onChanged: (value) {
print(value);
},
) : Container() ,
first ? RoundedPasswordField(
onChanged: (value) {},
) : Container() ,
second ? RoundedInputField(
hintText: "Your Number",
icon: Icons.phone,
onChanged: (value) {
print(value);
},
) : Container() ,
first ? Container(
margin: EdgeInsets.symmetric(vertical: 10),
width: size.width * 0.8,
child: ClipRRect(
borderRadius: BorderRadius.circular(29),
child: FlatButton(
padding: EdgeInsets.symmetric(vertical: 20, horizontal: 40),
color: kPrimaryColor,
onPressed: (){
print('working');
setState(){
first = false;
second = true;
}
},
child: Text(
'NEXT',
style: TextStyle(color: Colors.white),
),
),
),
): Container(),
second ? RoundedButton(
text: "REGISTER",
press: () {
print('working');
},
) : Container() ,
SizedBox(height: size.height * 0.03),
AlreadyHaveAnAccountCheck(
login: false,
press: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return LoginScreen();
},
),
);
},
),
],
),
),
);
}
}
我正在使用setState更改不起作用的布尔值,也尝试简单地打印字符串但它也不起作用。如果我在此使用导航器来更改页面,则其工作正常
答案 0 :(得分:0)
您应在实例级别声明first
和second
,否则它们将在执行setState
之后使用默认值再次创建。
class Body extends StatelessWidget {
bool first = true;
bool second = false;
@override
Widget build(BuildContext context) {
....
}
}
setState
的使用不正确。您需要拥有
setState((){
first = false;
second = true;
});
您的代码正在调用setState
而没有采取任何措施,并且在之后,您更改了first
和second
变量(但在setState
之外)。
您的代码等同于
setState();
first = false;
second = true;
您不应该在first
内再次声明second
和onPressed
,否则您将处理仅此方法作用域的新变量
setState((){
first = false;
second = true;
});
您的窗口小部件必须是有状态的,而不是无状态的,否则它将无法更改状态。