Flutter firestore получает поток идентификаторов документов из коллекции

# #firebase #flutter #google-cloud-firestore

Вопрос:

У меня есть приведенное ниже будущее, которое возвращает список строк, вместо этого я хотел бы вернуть список строк потока с тем же списком идентификаторов документов, как мне это сделать?

 Future<List<String>> getFollowingUidList(String uid) async{

final QuerySnapshot result = await FirebaseFirestore.instance.collection('following').doc(uid).collection('user_following').get();
final List<DocumentSnapshot> documents = result.docs;

List<String> followingList = [];

documents.forEach((snapshot) {
  followingList.add(snapshot.id);
});

return followingList;

}
 

Комментарии:

1. вместо [...].get() этого возвращает Future use [...]. snapshots() , который возвращает Stream

2. @pskink Как мне передавать идентификаторы документов из потока<QuerySnapshot> snapshots = FirebaseFirestore.instance.collection(‘following’).doc(uid).collection(‘user_following’).snapshots();

3. вам нужно «изменить» свой оригинал Stream , подробнее здесь: dart.dev/tutorials/language/streams#modify-stream-methods

Ответ №1:

Согласно документации FlutterFire, snapshots() метод CollectionReference вернет поток. В Dart потоки предоставляют map() метод, который позволяет легко преобразовать поток и вернуть новый:

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

Исходя из этого, можно было бы вернуть новый поток с идентификаторами документов из snapshots() потока, который поступает из CollectionReference . Поток CollectionReference имеет тип QuerySnapshot , который, согласно документации, содержит docs свойство type List<QueryDocumentSnapshot> . Чтобы закончить, этот тип может предоставить вам data из DocumentSnapshots , включая идентификатор документа.

 Stream<List<String>> returnIDs() {
    return Firestore.instance
        .collection('testUsers')
        .snapshots()
        .map((querySnap) => querySnap.docs //Mapping Stream of CollectionReference to List<QueryDocumentSnapshot>
        .map((doc) => doc.data.id) //Getting each document ID from the data property of QueryDocumentSnapshot
        .toList());
 }
 

Я основал этот фрагмент на этом примере, который полон полезных скриптов для использования потоков с Firestore.