#firebase #flutter #google-cloud-firestore #stream-builder
#firebase #флаттер #google-облако-firestore #stream-builder
Вопрос:
Я попробовал оба приведенных ниже кода: один с StreamBuilder.ListView и другой StreamBuilder.ListView.builder. Я не смог получить результат. Он показывает
Метод ‘data’ был вызван в null. Получатель: null Пытался вызвать: data()
Я не могу понять, как работают QuerySnapshots
class FeedStream extends StatelessWidget {
FeedStream();
Map document;
@override
Widget build(BuildContext context) {
return Scaffold(
body: StreamBuilder(
stream: FirebaseFirestore.instance.collection('users').snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (!snapshot.hasData) {
return Center(
child: CircularProgressIndicator(),
);
}
return ListView.builder(
itemCount: 2,
itemBuilder: (context, index) {
return _buildList(context, snapshot.data.docs[index]);
},
);
},
),
);
}
Widget _buildList(BuildContext context, DocumentSnapshot document) {
return ListTile(
title: Text(document.data()['displayName']),
subtitle: Text(document.data()['bio']),
);
}
}
class FeedStream extends StatelessWidget {
FeedStream();
Map document;
@override
Widget build(BuildContext context) {
return Scaffold(
body: StreamBuilder(
stream: FirebaseFirestore.instance.collection('users').snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (!snapshot.hasData) {
return Center(
child: CircularProgressIndicator(),
);
}
return ListView(
children: snapshot.data.docs.map((document) {
return Center(
child: Container(
height: MediaQuery.of(context).size.height / 6,
child:
Text('Name:' document.data()['displayName'].toString()),
),
);
}).toList(),
);
},
),
);
}
}
Может кто-нибудь исправить это, пожалуйста?
Ответ №1:
Вы говорите, что есть два документа:
return ListView.builder(
itemCount: 2, // HERE
itemBuilder: (context, index) {
return _buildList(context, snapshot.data.docs[index]);
},
);
Но это не всегда так, и когда документов меньше 2, вы получаете ошибку, которую видите.
Решение состоит в том, чтобы вернуть количество элементов, соответствующее количеству документов в моментальном снимке запроса:
return ListView.builder(
itemCount:, snapshot.data.docs.length,
itemBuilder: (context, index) {
return _buildList(context, snapshot.data.docs[index]);
},
);
Комментарии:
1. Привет, Фрэнк ван Пуффелен. Спасибо за ответ. Я попробовал еще раз. Он по-прежнему показывает ту же ошибку
Ответ №2:
У StreamBuilder есть свойство с именем initialData. Вы можете попробовать предоставить ему пустой список.
Пример:
StreamBuilder<T>(
initialData: [],
stream: _myStream,
builder: _myBuilder,
);