Отображение текста ошибки в текстовом поле в ShowDialog

#flutter #error-handling #textfield

#flutter #обработка ошибок #текстовое поле

Вопрос:

Я пытаюсь создать AlertDialog для повторной аутентификации пользователя перед удалением учетной записи. Я хотел бы показать текст ошибки, когда повторная проверка подлинности не работает. Ошибки обрабатываются правильно, как я вижу, с помощью операторов print(). Однако я не могу заставить текстовое поле отображать ошибку в качестве обратной связи с пользователем. Я думаю, что это должно быть как-то связано с состоянием самого SimpleDialog, а не с состоянием внешнего виджета… Вот код:

 
Future _validate({String email, String password}) async {
    setState(() {
      _wrongEmail = false;
      _wrongPassword = false;
      _emailErrorText = null;
      _passwordErrorText = null;
    });

    try {
      if (await userDataBase.checkCorrectEmail(
          email: email, loggedInUser: widget.user.id)) {
        throw FirebaseAuthException(
            message: 'email is not correct', code: 'user-not-found');
      }
      await userDataBase.authenticateUser(email, password);
    } catch (e) {
      if (e.code == 'wrong-passwod') {
        setState(() {
          _passwordErrorText = 'Password not Correct';
        });
      } else if (e.code == 'user-not-found') {
        setState(() {
          _emailErrorText = 'Email not Correct';
        });
      } else {
        setState(() {
          _emailErrorText = 'Email not Correct';
          _passwordErrorText = 'Password not Correct';

          _wrongPassword = true;
          _wrongEmail = true;
        });
      }
      throw e;
    }
  }

  Future _authenticate({String email, String password}) async {
    try {
      await _validate(email: email, password: password);
    } catch (e) {
      print(e.code);
      print(_wrongEmail);
      print(_emailErrorText);
      return;
    }

    print('correct behaviour');

    // Navigator.pop(context);
    // setState(() {
    //   _loading = true;
    // });

    // await userDataBase.deleteUser(widget.user.id);
    // Navigator.of(context).popUntil((route) => route.isFirst);
  }

  Future _confirmIdentity() {
    final emailController = TextEditingController();
    final passwordController = TextEditingController();
    _emailErrorText = null;
    _passwordErrorText = null;
    return showDialog(
      context: context,
      builder: (context) => AlertDialog(
        content: Container(
          height: 200,
          child: Column(
            children: [
              Text('Confirm Your Identity'),
              TextField(
                controller: emailController,
                decoration: InputDecoration(
                    errorText: _wrongEmail ? _emailErrorText : null,
                    labelText: 'email'),
              ),
              TextField(
                controller: passwordController,
                decoration: 
                     InputDecoration(
                       errorText: _wrongPassword ? _passwordErrorText : null, 
                       labelText: 'password'
                     ),
              ),
              Spacer(),
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  FlatButton(
                    onPressed: () {
                      _authenticate(
                          email: emailController.text,
                          password: passwordController.text);
                    },
                    child: Text('Confirm'),
                  ),
                  FlatButton(
                    onPressed: () => Navigator.pop(context),
                    child: Text('Cancel'),
                  ),
                ],
              )
            ],
          ),
        ),
      ),
    );
  }

 

Спасибо. Я могу опубликовать весь код виджета ecc. если вам это нужно: это виджет с полным состоянием.

Ответ №1:

Для условий 1st 2 if вы устанавливаете сообщение об ошибке, но не устанавливаете для соответствующих логических флагов значение true. Пример:

 if (e.code == 'wrong-passwod') {
    setState(() {
      _passwordErrorText = 'Password not Correct';
    });
  }
 

Здесь, в setState() функции, вам также нужно будет установить _wrongPassword = true;

Ответ №2:

Я исправил проблему. Логические переменные _wrongPassword, _wrongEmail не являются обязательными, поскольку, когда _PasswordErrorText или _EmailErrorText имеют значение null, текст ошибки по умолчанию не отображается.

Необходимо создать виджет с полным состоянием, который является содержимым ShowDialog! тогда все работает.