Почему Future <String>возвращает "Экземпляр будущего <String>", а не возвращаемое значение в моем потоке - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь получить идентификатор пользователя текущего пользователя, вошедшего в систему. Вот как я пытаюсь получить идентификатор пользователя в виде строки, где функции печатают $ userId, а также $ uid.

String userId;

Future<String> getUser() async {
  final FirebaseUser user = await FirebaseAuth.instance.currentUser();
  final String uid = user.uid.toString();

  print("uid in getuser function $uid");
  userId = uid;
  return uid;
}

И это поток, в который я пытаюсь получить UserID (uid) (и Futures, и Stream находятся в одном классе) (оператор return в Stream можно игнорировать)

// get hotel stream
Stream<List<Hotel>> get userHotels {

  print("This is the uid ${getUser().toString()} in Stream");
  return ownerCollection.document(uid).collection("hotels").snapshots()
     .map(_hotelListFromSnapshot);
}

Печать $ getUser (). ToString () выдает это в консоли: «Это экземпляр uid« Future »в Stream», а не печатает фактический UserID.

И печать $ userId дает это в консоль: «Это нулевой uid в Stream»

Пожалуйста, помогите, я хочу получить UserId текущего пользователя, подписанного в Stream

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Как определено выше getUser() возвращает Future<String>. Так что toString() на этом вернет Instance of 'Future'.

Что вы, вероятно, хотите сделать, это дождаться, пока getUser() не завершится sh в первую очередь. Вы можете сделать это, используя asyn c генераторы, с async* и yield*.

// get hotel stream
Stream<List<Hotel>> get userHotels async* {
  final uid = await getUser();
  print("This is the uid $uid in Stream");
  yield* ownerCollection.document(uid).collection("hotels").snapshots()
    .map(_hotelListFromSnapshot);
}

Использование async* означает, что вы вернете Stream. Затем, дождавшись окончания getUser() до sh, вы можете поместить значения в этот поток с помощью yield. yield* специально означает, что вы помещаете значения другого Stream в значение, которое вы возвращаете.

0 голосов
/ 01 мая 2020

Ваша функция getUser() будет работать так же, как функция FirebaseAuth.instance.currentUser(), которую вы используете, и вернет будущее. Если вы хотите распечатать его, вам нужно либо использовать await, как вы делали ранее, либо функцию then.

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

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