#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. Конечно, спасибо.