Регистрация во Flutter с использованием Firebase не работает

Я создаю приложение Flutter с аутентификацией Firebase и реализую регистрацию пользователей с использованием электронной почты и пароля. Все работает нормально, за исключением одной проблемы: когда пользователь вводит неверный адрес электронной почты (например, отсутствует символ «@»), обработчик ошибок (try-catch) не работает.

class RegisterPage extends StatefulWidget {
  const RegisterPage({super.key});

  @override
  State<RegisterPage> createState() => _RegisterPageState();
}

class _RegisterPageState extends State<RegisterPage> {
  final _formKey = GlobalKey<FormState>();

  TextEditingController emailController = TextEditingController();
  TextEditingController passwordController = TextEditingController();
  TextEditingController confirmPasswordController = TextEditingController();

  bool isVisibilityPassword = true;
  bool isVisibilityConfirmPassword = true;
  String? error;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: SingleChildScrollView(
          child: Form(
            key: _formKey,
            child: SizedBox(
              width: 400,
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Text(
                    "Register",
                    style: Theme.of(context).textTheme.headlineLarge,
                  ),
                  const SizedBox(height: 20),
                  TextFormField(
                    controller: emailController,
                    keyboardType: TextInputType.emailAddress,
                    decoration: const InputDecoration(
                      labelText: "email",
                      prefixIcon: Icon(Icons.email),
                    ),
                    onChanged: (value) {
                      setState(() {
                        error = null;
                      });
                    },
                    validator: (value) {
                      if (value == null || value.isEmpty) {
                        return "field must not ne empty";
                      } else if (error != null) {
                        return error;
                      }
                      return null;
                    },
                  ),
                  const SizedBox(height: 20),
                  TextFormField(
                    controller: passwordController,
                    obscureText: isVisibilityPassword,
                    decoration: InputDecoration(
                        labelText: "pssword",
                        prefixIcon: const Icon(Icons.lock),
                        suffix: Builder(builder: (context) {
                          return IconButton(
                            onPressed: () {
                              setState(() {
                                isVisibilityPassword = !isVisibilityPassword;
                              });
                            },
                            icon: isVisibilityPassword
                                ? const Icon(Icons.visibility_off)
                                : const Icon(Icons.visibility),
                          );
                        })),
                    validator: (value) {
                      if (value == null || value.isEmpty) {
                        return "field must not ne empty";
                      } else if (value.length < 6) {
                        return "password must not be less that 6";
                      }
                      return null;
                    },
                  ),
                  const SizedBox(height: 20),
                  TextFormField(
                    controller: confirmPasswordController,
                    obscureText: isVisibilityConfirmPassword,
                    decoration: InputDecoration(
                      labelText: "confirm password",
                      prefixIcon: const Icon(Icons.lock),
                      suffix: Builder(
                        builder: (context) {
                          return IconButton(
                            onPressed: () {
                              setState(() {
                                isVisibilityConfirmPassword =
                                    !isVisibilityConfirmPassword;
                              });
                            },
                            icon: isVisibilityConfirmPassword
                                ? const Icon(Icons.visibility_off)
                                : const Icon(Icons.visibility),
                          );
                        },
                      ),
                    ),
                    validator: (value) {
                      if (value == null || value.isEmpty) {
                        return "field must not ne empty";
                      } else if (value.length < 6) {
                        return "password must not be less that 6";
                      } else if (passwordController.text != value) {
                        return "passwords don't match";
                      }
                      return null;
                    },
                  ),
                  const SizedBox(height: 24),
                  ElevatedButton(
                    onPressed: () async {
                      if (_formKey.currentState!.validate()) {
                        try {
                          await FirebaseAuth.instance
                              .createUserWithEmailAndPassword(
                            email: emailController.text,
                            password: passwordController.text,
                          );
                        } on FirebaseAuthException catch (e) {
                          print(e);
                          setState(() {
                            error = e.message;
                          });
                        }
                      }
                    },
                    child: const Text("Register"),
                  ),
                  const SizedBox(height: 6),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      Text("already have an account?",
                          style: Theme.of(context).textTheme.labelLarge),
                      TextButton(
                        onPressed: () {
                          Navigator.pushNamed(context, "/loginPage");
                        },
                        child: Text(
                          "Login",
                          style: Theme.of(context).textTheme.titleSmall,
                        ),
                      )
                    ],
                  )
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}

код останавливается на строке await FirebaseAuth.instance с ошибкой, которую необходимо обработать в блоке catch

Работайте для меня здесь: zapp.run/edit/auth-example-z124069j1250?entry=lib/… (нажмите кнопку «Отключить пользователя с помощью электронной почты + пароля»). Можете ли вы создать аналогичный пример, демонстрирующий проблему?

Frank van Puffelen 25.06.2024 23:10

у меня происходит нечто подобное: ссылка

Fileurix3 26.06.2024 18:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне действительно следовало отключить два флажка

Другие вопросы по теме