В приложении, которое я создаю в рамках процесса регистрации, для каждого документа «Пользователь» создается подколлекция, содержащая до 100 документов.
Я пытаюсь показать эти суб документы в формате StreamBuilder
.
У меня есть любопытная ошибка, которую я не могу устранить. StreamBuilder
не отображает данные, когда пользователь впервые просматривает их. Вместо этого он возвращает пустой список.
Я вижу, что документы были правильно созданы в под-коллекции. Данные устанавливаются на странице перед страницей с StreamBuilder. Даже если бы были задержки, я бы подумал, что новые документы только начали бы появляться в StreamBuilder
. Представление консоли Firebase
StreamBuilder отображает ожидаемых данных при перезапуске приложения или при выходе пользователя из системы и повторном входе в систему.
Ниже приведен код, который я использую:
Stream<QuerySnapshot> provideActivityStream() {
return Firestore.instance
.collection("users")
.document(widget.userId)
.collection('activities')
.orderBy('startDate', descending: true)
.snapshots();
}
...
Widget activityStream() {
return Container(
padding: const EdgeInsets.all(20.0),
child: StreamBuilder<QuerySnapshot>(
stream: provideActivityStream(),
builder: (BuildContext context,
AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasError)
return new Text('Error: ${snapshot.error}');
if(snapshot.data == null) {
return CircularProgressIndicator();
}
if(snapshot.data.documents.length < 1) {
return new Text(
snapshot.data.documents.toString()
);
}
if (snapshot != null) {
print('$currentUser.userId');
}
if (
snapshot.hasData && snapshot.data.documents.length > 0
) {
print("I have documents");
return new ListView(
children: snapshot.data.documents.map((
DocumentSnapshot document) {
return new PointCard(
title: document['title'],
type: document['type'],
);
}).toList(),
);
}
}
)
);
}
Редактирование: добавление основной сборки согласно запросу на комментарий
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: 3,
child: Scaffold(
appBar: AppBar(
title: Text("Home"),
actions: <Widget>[
],
bottom: TabBar(
tabs: [
Text("Account"),
Text("Activity"),
Text("Links"),
],
),
),
body: TabBarView(
children: [
accountStream(),
activityStream(),
linksStream()
]
)
),
);
}
}
Попытки, которые я сделал для решить
Сначала я думал, что это ошибка соединения, поэтому создал серию дел на основе switch (snapshot.connectionState)
. Я вижу, что ConnectionState.active = true
, поэтому мысль о том, что добавление нового документа в Firestore может иметь эффект, но ничего не дает.
Я попробовал следующее, чтобы сделать первоначальный конструктор потока асинхронным. Не удается загрузить какие-либо данные.
Stream<QuerySnapshot> provideActivityStream() async* {
await Firestore.instance
.collection("users")
.document(widget.userId)
.collection('activities')
.orderBy('startDate', descending: true)
.snapshots();
}
Я пытался удалить элемент tabcontroller - например, просто иметь одну страницу - но это тоже не помогает.
Я пробовал доступ к данным с использованием DocumentSnapshot
и QuerySnapshot
. У меня проблема с обоими.
Я уверен, что это очень просто, но застрял на этом. Любая помощь с благодарностью. Спасибо!