# #flutter #google-cloud-firestore
Вопрос:
В настоящее время я просматриваю список списков, чтобы получить пользователей, которые заинтересованы в событии. У меня он установлен, initState
но при добавлении или удалении идентификатора из Firestore
документа изменения не отражаются в пользовательском интерфейсе. Я не хочу обновлять списки вручную. Есть ли способ переместить этот код из initState
в а StreamBuilder
?
@override
void initState() {
super.initState();
final interestedUsers = widget.content.interested;
var chunks = [];
for (var i = 0; i < interestedUsers.length; i = 10) {
chunks.add(interestedUsers.sublist(i,
i 10 > interestedUsers.length ? interestedUsers.length : i 10));
}
for (var i = 0; i < chunks.length; i ) {
final snapshot = FirebaseFirestore.instance
.collection('users')
.where('uid', whereIn: chunks[i])
.snapshots();
snapshot.forEach((element) {
element.docs.forEach((element) {
final userElement = UserModel.fromFirestore(element);
setState(() {
interested.add(userElement);
});
});
});
}
}
Ответ №1:
Вы можете написать это так, как здесь…это полный пример, который обрабатывает состояние загрузки и пустоты, чтобы:
StreamBuilder(
stream: _firestore
.collection('users')
.where('uid', whereIn: chunks[i])
.snapshots(),
builder:
(BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
//Shows loading indicator
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(
child: CircularProgressIndicator( ),
);
}
List<UserNotificationListTile> items = [];
unredNotifications = [];
List<QueryDocumentSnapshot> groups = snapshot.data.docs;
for (QueryDocumentSnapshot g in groups) {
UserNotification userNotification =
new UserNotification.fromSnapshot(g);
items.add(
UserNotificationListTile(
userNotification: userNotification,
),
);
}
//Shows result when there is no data
if (items.length == 0) {
return Center(child: NotificationsEmpty());
}
return Column(
children: [
Expanded(
child: ListView(
padding: EdgeInsets.symmetric(horizontal: 10, vertical: 0),
children: items.reversed.toList(),
),
),
],
);
}),
);
Комментарии:
1. Спасибо. Я постараюсь сообщить вам, как все пройдет.
2. Значит, это идет по кругу?
3. Вы помещаете это
StreamBuilder
в пользовательский интерфейс, как если бы это был виджет.return
Вbuilder
нем это будет возвращено в виде виджетов пользовательского интерфейса.4. да… но у тебя есть
chunks[i]
. Кто этоi
? Там будет несколько фрагментов, каждый из которых содержит десять идентификаторов.5. Если у вас есть вложенные списки, вы можете поместить
StreamBuilder
их в другой. Просто верните дочерний внутри родительского.