Как получить список элементов ленты из моментального снимка документа запроса?

#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,
);