База данных Firebase в реальном времени вызывает ошибку «null», если нет совпадающих данных

#firebase #flutter #firebase-realtime-database

#firebase #flutter #firebase-realtime-database

Вопрос:

В моем коде flutter я пытаюсь получить данные из базы данных Firebase в реальном времени. Ниже приведен мой код.

 final DatabaseReference reference = FirebaseDatabase.instance.reference().child('chat_room');

    return Scaffold(
      body: StreamBuilder(
          stream:
              reference.orderByChild("email").equalTo("abcd@test.com").onValue,
          builder: (context, snapshot) {
            if (snapshot == null || !snapshot.hasData) {
              return Container(child: Center(child: Text("No data")));
            } else {
              Map<dynamic, dynamic> map = snapshot.data.snapshot.value;
              return ListView.builder(
                  itemCount: map.values.toList().length,
                  itemBuilder: (context, index) {
                    String imageURL = map.values.toList()[index]["imageUrl"];
                    return Container(
                      margin: EdgeInsets.only(top: 10),
                      child: ListTile(
                        leading: CircleAvatar(
                          radius: 30.0,
                          backgroundImage: NetworkImage(imageURL),
                          backgroundColor: Colors.transparent,
                        ),
                        title: Text(
                          map.values.toList()[index]["email"],
                        ),
                      ),
                    );
                  });
            }
          }),
    );
  

Обратите внимание, я загружаю данные, где email равно abcd@test.com . Код отлично работает, если есть запись для abcd@test.com . Но если база данных пуста или в ней нет записей abcd@test.com , я получаю следующую ошибку

 The following NoSuchMethodError was thrown building StreamBuilder<Event>(dirty, state: _StreamBuilderBaseState<Event, AsyncSnapshot<Event>>#ad47f):
The getter 'values' was called on null.
Receiver: null
Tried calling: values

The relevant error-causing widget was
StreamBuilder<Event>
package:xxx/…/chat/chat_list_supplier.dart:19
When the exception was thrown, this was the stack
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
#1      _ChatListSupplierState.build.<anonymous closure>
package:xxx/…/chat/chat_list_supplier.dart:28
  

Как я могу это исправить?

Ответ №1:

Проблема в том, что есть снимок, но снимок не содержит данных. Это проще всего поймать в:

   builder: (context, snapshot) {
    if (snapshot == null || !snapshot.hasData || snapshot.data.snapshot.value == null) {
      return Container(child: Center(child: Text("No data")));
    } else {
      ...
  

Комментарии:

1. Спасибо за помощь. в любом случае, в вашем коде необходимо исправить одну вещь. Это должно быть snapshot.data.snapshot.value == null и не !snapshot.data.snapshot.value == null

2. Хороший улов. Обновлено в моем ответе, и не стесняйтесь исправлять такие опечатки непосредственно в будущем ответе.

3. Конечно, спасибо.