#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! тогда все работает.