Как построить поток на основе будущего результата во флаттере? - PullRequest
0 голосов
/ 25 июня 2019

У меня есть приложение Flutter, которое использует Firebase-storage и google-signin.шаги, которые я пытаюсь сделать, очень просты:

1- Войдите в систему с помощью Google (Готово).

2- Получите текущий идентификатор пользователя (Готово).

3- Используйте идентификатор пользователя при создании потока для построителя потока (проблема).

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

.where('userId', isEqualTo: userId)

и вот что я получаю в итоге:

это та часть, где я должен создать поток:

  // Get document's snapshots and return it as stream.
  Future<Stream> getDataStreamSnapshots() async {
    // Get current user.
    final User user = await FirebaseAuth().currentUser();
    String userId = user.uid;

    Stream<QuerySnapshot> snapshots =
      db
        .collection(db)
        .where("uid", isEqualTo: userId)
        .snapshots();

    try {
      return snapshots;
    } catch(e) {
      print(e);
      return null;
    }
  }

и это та часть, где я должен позвонить и получить поток,

...
children: <Widget>[
    StreamBuilder<QuerySnapshot>(
          stream: CALLING THE PREVIOUS FUNCTION,
            builder: (BuildContext context, 
                      AsyncSnapshot<QuerySnapshot> snapshot) {
                if (snapshot.hasData) {
                    ...
                }
              ...

Но этот код не работает, потому что я не могу получить значение, которое должно быть возвращенобудущее?любая идея?

спасибо большое

1 Ответ

2 голосов
/ 25 июня 2019

У вас никогда не должно быть Future<Stream>, это двойная асинхронность, которая не нужна. Просто верните Stream, и тогда вам не нужно генерировать какие-либо события, пока вы не будете готовы.

Непонятно, что try / catch защищает, потому что возврат не-1007 * не может бросить. Если вы возвращаете поток, просто создайте любую ошибку в потоке.

Вы можете переписать код как:

Stream<QuerySnapshot> getDataStreamSnapshots() async* {
  // Get current user.
  final User user = await FirebaseAuth().currentUser();
  String userId = user.uid;

  yield* db
    .collection(db)
    .where("uid", isEqualTo: userId)
    .snapshots();
}

Функция async* является асинхронной, поэтому вы можете использовать await. Он возвращает Stream, и вы отправляете события в потоке, используя yield event; или yield* streamOfEvents;.

...