# #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.