Как построить потоковый контроллер для прослушивания onAuthStateChanged для Firebase Authentication? - PullRequest
0 голосов
/ 25 марта 2020

Это может быть нубский вопрос, но я пытаюсь добавить некоторые функциональные возможности поверх потока c Аутентификации Firebase во Flutter (вот пример ). У меня есть поток ниже, чтобы получить экземпляры пользователя Firebase, когда пользователь входит в систему / выходит, которую я конвертирую в модель пользователя моего приложения.

 // auth changes user stream
Stream<User> get user {

  return _auth.onAuthStateChanged
    .map((FirebaseUser user) => User(uid: user.uid));
}

Это все хорошо, но поскольку у пользователя Firebase очень ограниченные свойства, мне нужно получить дополнительные пользовательские данные. Я делаю это в асинхронном c запросе Firestore, который возвращает экземпляр пользователя с дополнительными заполненными свойствами.

Моя проблема в том, что мне трудно понять, как я могу построить контроллер потока поверх потока выше , чтобы добавить результаты моего асинхронного запроса c, чтобы что мой поток делает экземпляр User со всеми заполненными свойствами доступными для остальной части приложения.

Заранее спасибо! Кроме того, если у кого-нибудь есть предложения о том, как получить этот дополнительный пользователь после входа в систему, мне было бы интересно услышать, как выглядят лучшие практики :)

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Исходя из того, что предложил Кахоу, вот решение с StreamTransformer:

  // create stream transformer to modify onAuthStateChanged
  StreamTransformer getOtherUserInfo() => StreamTransformer<User, User>.fromHandlers(handleData:
    (user, sink) async {
      if (user == null) {

      } else {
        User appUser = await _getUserDetailsAsync(user);
        sink.add(appUser);
      }
    }
  );

Я использую _getUserDetailsAsyn c, чтобы получить больше пользовательских данных из Firestore ...

, чем я просто добавьте StreamTransformer в исходный поток:

  // auth changes user stream
  Stream<User> get user {
    return _auth.onAuthStateChanged
      .map((FirebaseUser user) => User(uid: user.uid))
      .transform(getOtherUserInfo());
  }
0 голосов
/ 26 марта 2020

Использование StreamTransformer

  var userTransformer = StreamTransformer<FirebaseUser, User>.fromHandlers(
    handleData: (value, sink) => sink.add(User(uid: value.uid)),
  );
Stream<User> get user {
  return _auth.onAuthStateChanged.transform(userTransformer);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...