Закусочная появляется повторно после появления один раз

Я показал закусочную после неправильного входа в систему во флаттере. Но после появления один раз закусочная появляется снова, даже не нажимая кнопку отправки. Где я делаю неправильно? Пожалуйста помоги. Вот мой код ниже. В части snapshot.data.status == '2' я показываю закусочную. Я хочу, чтобы закусочная отображалась только тогда, когда вход в систему не выполнен, то есть когда snapshot.data.status == '2' удовлетворяет.

class MyApp extends StatefulWidget {
  final UserDataStorage storage;

  MyApp({Key key, @required this.storage}) : super(key: key);
  @override
  State<StatefulWidget> createState() {
    return _TextControl();
  }
}

class _TextControl extends State<MyApp> {
  final _formKey = GlobalKey<FormState>();
  bool snackBarActive = false;
  @override
  void initState() {
    super.initState();
    widget.storage.readCounter().then((int value) {
      if (value > 0) {
        Navigator.push(
          context,
          MaterialPageRoute(
              builder: (context) => TextInput(storage: GetDataStorage())),
        );
      }
    });
  }

  final TextEditingController _controller = TextEditingController();
  final TextEditingController _controller2 = TextEditingController();

  @override
  void dispose() {
    _controller.dispose();
    _controller2.dispose();
    super.dispose();
  }

  Future<Login> _futureLogin;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        backgroundColor: Colors.purple[400],
        title: Text('Login'),
      ),
      body: Container(
          padding: EdgeInsets.only(left: 15, top: 20, right: 15, bottom: 20),
          child: Column(
            children: <Widget>[
              Center(
                child: Image(image: AssetImage('assets/images/logo.png')),
              ),
              Container(
                padding: EdgeInsets.only(left: 0, top: 20, right: 0, bottom: 0),
                child: Form(
                    key: _formKey,
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.center,
                      children: <Widget>[
                        Column(
                          children: <Widget>[
                            TextFormField(
                              controller: _controller,
                              decoration: InputDecoration(hintText: 'Email'),
                              keyboardType: TextInputType.emailAddress,
                              validator: (value) {
                                if (value.isEmpty || !value.isValidEmail()) {
                                  return 'Please enter valid email.';
                                }
                                return null;
                              },
                            ),
                            TextFormField(
                              controller: _controller2,
                              decoration: InputDecoration(hintText: 'Password'),
                              obscureText: true,
                              validator: (value) {
                                if (value.isEmpty) {
                                  return 'Please enter password.';
                                }
                                return null;
                              },
                            ),
                            Container(
                              margin: EdgeInsets.only(top: 10.0),
                              child: RaisedButton(
                                color: Colors.purple[400],
                                padding: EdgeInsets.only(
                                    left: 130, top: 10, right: 130, bottom: 10),
                                textColor: Colors.white,
                                onPressed: () {
                                  if (_formKey.currentState.validate()) {
                                    setState(() {
                                      _futureLogin = userLogin(
                                          _controller.text, _controller2.text);
                                    });
                                    Scaffold.of(context)
                                        .removeCurrentSnackBar();
                                  }
                                },
                                child: Text('Login',
                                    style: TextStyle(fontSize: 18.0)),
                              ),
                            ),
                          ],
                        ),
                        (_futureLogin != null)
                            ? FutureBuilder<Login>(
                                future: _futureLogin,
                                builder: (context, snapshot) {
                                  if (snapshot.hasData) {
                                    if (snapshot.data.status == '1') {
                                      widget.storage
                                          .writeCounter(snapshot.data.usrid);
                                      Navigator.push(
                                        context,
                                        MaterialPageRoute(
                                            builder: (context) => TextInput(
                                                storage: GetDataStorage())),
                                      );
                                    } else if (snapshot.data.status == '2') {
                                      snackBarActive = true;
                                      if (snackBarActive) {
                                        Scaffold.of(context)
                                            .showSnackBar(SnackBar(
                                              content: Text(
                                                  "Invalid login credentials.",
                                                  style: TextStyle(
                                                      color: Colors.red[100])),
                                            ))
                                            .closed
                                            .whenComplete(() {
                                          setState(() {
                                            snackBarActive = false;
                                          });
                                        });
                                      }

                                      return Text('');
                                    }
                                  } else if (snapshot.hasError) {
                                    return Text("${snapshot.error}");
                                  }
                                  return Center(
                                      child: CircularProgressIndicator());
                                },
                              )
                            : Text(''),
                      ],
                    )),
              ),
            ],
          )),
    );
  }
}

person Ayan    schedule 11.12.2020    source источник
comment
Да я именно этим и занимаюсь. Если вы думаете, что есть другой способ сделать это, пожалуйста, укажите. Раньше я использовал showSnackBar() в блоке snapshot.data.status == '2'. Но в этом случае, после того, как вход в систему завершился неудачно, закусочная появлялась даже при успешном входе в систему. Если вы предлагаете другой способ, пожалуйста, поделитесь.   -  person Ayan    schedule 11.12.2020


Ответы (1)


Пробовали ли вы изменить переменную состояния на 1 после проверки snapshot.data.status == '2', попробуйте это, и это может помочь вам остановить постоянное отображение виджета закусочной.

person RobHG    schedule 11.12.2020
comment
Спасибо за помощь. Но я не могу установить статус на 1, потому что это статус успешного входа в систему, и после успешного входа пользователь будет перенаправлен на другой экран. - person Ayan; 14.12.2020