С Flutter, как я могу отобразить сообщения об ошибках Firebase Auth, захваченные в классе AuthService в отдельном виджете страницы входа в систему? - PullRequest
0 голосов
/ 18 марта 2020

У меня есть страница регистрации с моей формой регистрации, а затем класс AuthService, который я вызываю, чтобы зарегистрировать пользователя, возвращая сопоставленный пользовательский класс User. Я могу проверить, не является ли результат вызова функции нулевым, и, следовательно, переместить моего пользователя на домашнюю страницу, но я не могу понять, как задать setState или подобное, чтобы фактически показать пользователю сообщения Firebase Auth на моей странице регистрации, как блок try / catch находится в моем классе обслуживания auth.

Это мой сокращенный виджет экрана регистрации:

class RegistrationScreen extends StatefulWidget {
  @override
  _RegistrationScreenState createState() => _RegistrationScreenState();
}

class _RegistrationScreenState extends State<RegistrationScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      //abbreviated...
                RoundedButton(
                  onPressed: () async {
                    if (_formKey.currentState.validate()) {
                      dynamic result = await _auth.registerWithEmailAndPassword(email, password, displayName);
                     if (result != null) {
                       Navigator.pushNamedAndRemoveUntil(context, Home.id, (_) => false);
                      } 
                     }
                  }
                }
  }

registerWithEmailAndPassword находится в импортированном классе AuthService auth.dart:

class AuthService {
  final FirebaseAuth _auth = FirebaseAuth.instance;
  final _firestore = Firestore.instance;
  //create User object
  User _userFromFirebaseUser(FirebaseUser user) {
    return user != null ? User(uid: user.uid, displayName: user.displayName) : null;
  }

  //auth change user stream
  Stream<User> get user {
    return _auth.onAuthStateChanged
    .map(_userFromFirebaseUser);
  }

  // register
  Future registerWithEmailAndPassword(String email, String password, String displayName) async {
                      try { 
                      AuthResult result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
                      FirebaseUser user = result.user;

                      return _userFromFirebaseUser(user);
                    } catch(e) {
                      print(e);
                    } 
                      } 
  }

Если я проверю это с плохо отформатированное электронное письмо, которое я правильно печатаю на консоли:

flutter: PlatformException(ERROR_INVALID_EMAIL, The email address is badly formatted., null)

Однако как я могу использовать это PlatformException для setState или аналогичного на моем экране регистрации, чтобы показать e.message пользователю?

Спасибо.

1 Ответ

1 голос
/ 18 марта 2020

Вы можете создать класс, подобный этому;

class Errors {
   static String show(String errorCode) {
     switch (errorCode) {
       case 'ERROR_EMAIL_ALREADY_IN_USE':
         return "This e-mail address is already in use, please use a different e-mail address.";

       case 'ERROR_INVALID_EMAIL':
         return "The email address is badly formatted.";

       case 'ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL':
         return "The e-mail address in your Facebook account has been registered in the system before. Please login by trying other methods with this e-mail address.";

       case 'ERROR_WRONG_PASSWORD':
         return "E-mail address or password is incorrect.";

       default:
         return "An error has occurred";
     }
   }
}

И затем, когда вы получите сообщение об ошибке PlatformException, вы можете отобразить для пользователя диалоговое окно с предупреждением, например:

try { 
   AuthResult result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
   FirebaseUser user = result.user;

   return _userFromFirebaseUser(user);
} catch(e) {
   print(Errors.show(e.code));   // On this line, call your class and show the error message.
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...