Flutter Flatbutton onpressend不起作用

时间:2020-06-28 01:54:19

标签: flutter

我有一个注册页面,其中有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更改不起作用的布尔值,也尝试简单地打印字符串但它也不起作用。如果我在此使用导航器来更改页面,则其工作正常

1 个答案:

答案 0 :(得分:0)

  1. 您应在实例级别声明firstsecond,否则它们将在执行setState之后使用默认值再次创建。

     class Body extends StatelessWidget {
         bool first = true;
         bool second = false;
    
         @override
         Widget build(BuildContext context) {
         ....
         }
     }
    
  2. setState的使用不正确。您需要拥有

    setState((){
        first = false;
        second = true;
    });
    

    您的代码正在调用setState而没有采取任何措施,并且之后,您更改了firstsecond变量(但在setState之外)。

    您的代码等同于

    setState();
    first = false;
    second = true;    
    
  3. 您不应该在first内再次声明secondonPressed,否则您将处理仅此方法作用域的新变量

    setState((){
        first = false;
        second = true;
    });
    
  4. 您的窗口小部件必须是有状态的,而不是无状态的,否则它将无法更改状态。