Как вернуть пользователя Firebase для доступа к определенным элементам - PullRequest
0 голосов
/ 09 апреля 2019

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

Прямо сейчас я просто заставляю его возвращать пользователя, однако при вызове этой функции я получаю Instance of Firebase User в консоли. При попытке getSignedInUser (). Uid говорится, что у класса «Future» нет экземпляра getter «uid». Если в моей функции я распечатываю mCurrentUser.uid (на консоль), я получаю правильную распечатку. Я не хочу это в консоли. Если в другом файле я хочу получить доступ, например, к электронной почте текущего пользователя, я бы хотел вызвать эту функцию, например getSignedInUser (). Email (когда функция возвращает этого пользователя)

В аутентификации.дарт:

getSignedInUser() async {
  mCurrentUser = await FirebaseAuth.instance.currentUser();
  if(mCurrentUser == null || mCurrentUser.isAnonymous){
    print("no user signed in");
  }
  else{
    return mCurrentUser;
    //changing above line to print(mCurrentUser.uid) works, but that's useless 
    //for the purpose of this function
  }
}

в homescreen.dart после входа в систему у меня есть кнопка, которая проверяет текущего пользователя:

Widget checkUserButton() {
    return RaisedButton(
      color: Color.fromRGBO(58, 66, 86, 1.0),
      child: Text("who's signed in?", style: TextStyle(color: Colors.white)),
      onPressed: () {
        print(getSignedInUser().uid);
        //applying change to comments in getSignedInUser() function above 
        //changes this to just call getSignedInUser()
      },
    );
  }

Я ожидаю, что это возьмет возвращенного пользователя из функции getSignedInUser () и позволит мне использовать встроенные функции из класса Firebase Auth. Однако они не заполняются автоматически, как ожидалось, просто выдают ошибку времени выполнения, как указано выше. Я только распечатал его на консоли, чтобы увидеть мой вывод в качестве теста. Как только я узнаю, что я получаю доступ к полям, таким как идентификатор пользователя, я могу использовать эту информацию для выполнения того, что мне нужно, с любых других экранов (пока я импортирую authentication.dart). Спасибо за любую помощь

1 Ответ

1 голос
/ 10 апреля 2019

Вы забыли, что ваша getSignedInUser функция является асинхронной функцией, поэтому она возвращает объект Future в вашем случае Future<FirebaseUser>. Вы пытаетесь прочитать свойство uid из экземпляра объекта Future, поэтому вы получили сообщение об ошибке: У 'Future' нет экземпляра getter 'uid' .

Чтобы решить эту проблему, вам нужно await ваша функция, чтобы прочитать правильные результаты.

Widget checkUserButton() {
    return RaisedButton(
      color: Color.fromRGBO(58, 66, 86, 1.0),
      child: Text("who's signed in?", style: TextStyle(color: Colors.white)),
      onPressed: () async { // make on pressed async
        var fbUser = await = getSignedInUser(); // wait the future object complete
        print(fbUser.uid); // gotcha!
        //applying change to comments in getSignedInUser() function above 
        //changes this to just call getSignedInUser()
      },
    );
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...