Flutter войдите в систему как администратор, используя аутентификацию firebase по электронной почте и паролю в приложении android - PullRequest
0 голосов
/ 16 июня 2020

Я пытался сделать экран входа в систему, который; если пользователь входит в систему со своим адресом электронной почты и паролем, они будут отображать go на экранах пользователей; однако, если администратор войдет в систему со своим адресом электронной почты и паролем администратора, приложение отправит администратора на страницу администратора. Я создал метод, который, если у пользователя нет коллекции в firestore, приложение предоставит форму для записи их информации; если у них есть коллекция в firestore, они go на экране пользователя. Код выглядит следующим образом:

Объект для аутентификации

'final FirebaseAuth _auth = FirebaseAuth.instance;'

Вход с помощью электронной почты и пароля

      //sign-in with e-mail and password
  Future signInEmail (String email, String password) async{
    try{
      AuthResult result = await _auth
          .signInWithEmailAndPassword(email: email, password: password);
      FirebaseUser user = result.user;
      return _userFromFirebaseUser(user);
    } catch(e){
      print(e.toString());
      return null;
    }
  }

Войти с помощью электронной почты и пароля на странице входа

//... log-in page UI and form for taking e-mail and password from users
//... 

//log-in via e-mail
  void signIn() async {
    if (_formKey.currentState.validate()) {
      var firebaseUser = await FirebaseAuth.instance.currentUser();

      dynamic result = await _auth.signInEmail(email, password);

      if (result == null) { // if email is false
        setState(() {
          loading = false;
          error = "Wrong email";
        });
      } else if(firebaseUser.uid == "aMDsuSJ9h6eIJuWX0SvwmXJTvTJ3"){ // tried to find admin with its uid
          Navigator.push(context, MaterialPageRoute(builder: (context) => AdminHome()));
      } else { // sends to account page
          var firebaseUser = await FirebaseAuth.instance.currentUser();
          final snapShot = await Firestore.instance.collection("membership")
              .document(firebaseUser.uid)
              .get();

          if(snapShot.exists){ // if user has a collection, go to user screens
            Navigator.push(context, MaterialPageRoute(builder: (context) => AccountHome()));
          } else{ // if user doesn't have any collection, pop-up a dialog
            userInfoDialog(context);
          }
      }
    }
  }

1 Ответ

1 голос
/ 16 июня 2020

Вы получаете ссылку firebaseUser перед await _auth.signInEmail. На самом деле я ожидал, что firebaseUser будет null. Вы уверены, что не получаете исключение по номеру firebaseUser.uid?

Вы должны заменить эти две строки, например:

      dynamic result = await _auth.signInEmail(email, password);

      var firebaseUser = await FirebaseAuth.instance.currentUser();

Посмотрите, работает ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...