Я пытаюсь отобразить экран чата в реальном времени в flutter
с firebase-firestore
(равно главному экрану WhatsApp).
Работа: Создание списка всех контактов-пиров. Взгляните на мой список:
Container(
child: StreamBuilder(
stream:
//FirebaseFirestore.instance.collection('users').snapshots(),
FirebaseFirestore.instance
.collection('users')
.doc(currentUserId)
.collection('peers')
.snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Center(
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(themeColor),
),
);
} else {
return ListView.builder(
padding: EdgeInsets.all(10.0),
itemBuilder: (context, index) =>
buildItem(context, snapshot.data.documents[index]),
itemCount: snapshot.data.documents.length,
);
}
},
),
),
не работает: загружаются определенные данные для каждой плитки, такие как последнее сообщение или имя. Я не могу запросить это во время создания моего первого списка (первый запрос возвращает одноранговые идентификаторы, второй возвращает пользовательские данные однорангового идентификатора). Мой метод buildItem
состоит из другого построителя потоков, однако, как только первый построитель потоков вносит изменения, приложение зависает.
Widget buildItem(BuildContext context, DocumentSnapshot document) {
return StreamBuilder<DocumentSnapshot>(
stream: FirebaseFirestore.instance
.collection('users')
.doc(document.data()['peerId'])
.snapshots(),
builder: ...
Это правильный способ вложения потоков? Простые списки достаточно хорошо задокументированы, но я не смог найти хороший пример в Google. Любая помощь приветствуется.