首页 > 解决方案 > 为什么行动后不设置可见性?

问题描述

我正在尝试使用可见性来显示和隐藏我的容器。第一个容器包含登录按钮、注册按钮和忘记密码按钮。第二个容器具有电子邮件文本表单字段。密码文本框,然后登录按钮。

我想做的是;当我单击第一个容器中的登录按钮时,我可以看到第二个容器来填写我的登录凭据。但是目前,当我单击登录按钮时,什么也没有发生。这是为什么?我在这里错过了什么吗?

class StartPage extends StatefulWidget {
  _StartPageState createState() => new _StartPageState();
}

class _StartPageState extends State<StartPage> {
  Widget build(BuildContext context) {
    bool _toDoVisibility = true;
    bool _signInVisibility = false;

    void _showSignIn(){
      _signInVisibility = true;
      setState(() {
        _toDoVisibility = false;
        _signInVisibility = true;
      });
    }

    void _showToDo(){
      setState(() {
        _signInVisibility = false ;
        _toDoVisibility = true;
      });
    }

    final _toDo = Visibility(
      child: Container(
        alignment: Alignment.center,
        decoration: deco.gradient,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                ButtonTheme(
                  child: CustomButtonOutline(text: constant.signIn, onPressed: _showSignIn),
                ),
                SizedBox(width: 20.0),
                ButtonTheme(
                  child: CustomButtonOutline(text: constant.signUp, onPressed: _showToDo),
                ),
              ],
            ),
            SizedBox(height: 15.0),
            ButtonTheme(
              child: CustomButtonOutlineNoBorder(text: constant.forgotPassword, onPressed: () {
                Navigator.push(context,
                    MaterialPageRoute(builder: (context) => null));
              }),
            ),
          ],
        )),
      maintainSize: true,
      maintainAnimation: true,
      maintainState: true,
      visible: _toDoVisibility,
    );

    final _signIn = Visibility(
      child: SingleChildScrollView(
        padding: EdgeInsets.fromLTRB(30.0, 20.0, 30.0, 0.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            TextFormField(
              decoration: InputDecoration(labelText: constant.email),
              style: TextStyle(color: constant.colorWhite),
            ),
            SizedBox(height: 10.0),
            TextFormField(
              decoration: InputDecoration(labelText: constant.password),
              obscureText: true,
            ),
            SizedBox(height: 20.0),
            CustomButtonOutline(text: constant.signIn, onPressed: () {
              Navigator.push(context,
                  MaterialPageRoute(builder: (context) => null));
            }),
            SizedBox(height: 10.0),
          ],
        ),
      ),
      maintainSize: true,
      maintainAnimation: true,
      maintainState: true,
      visible: _signInVisibility,
    );

    return Scaffold(
      appBar: AppBar(
        elevation: 0.0,
        leading: IconButton(
          icon: Icon(Icons.arrow_back),
          onPressed: () => print('something'),
        ),
      ),
      body: Stack(
        fit: StackFit.expand,
        children: <Widget>[
          _toDo,
          _signIn,
        ],
      ),
    );
  }
}

标签: flutterdart

解决方案


您需要在 State 类中但在 build 方法之外定义可见性布尔值,如下所示:

class _StartPageState extends State<StartPage> {
    bool _toDoVisibility = true;
    bool _signInVisibility = false;
    Widget build(BuildContext context) {
    ...
    }
}

推荐阅读