I am using flutter and firebase to create a mobile app. I have 2 collections on my firestore and i wanna read all documents in a the collection "posts". However, when I do that, an error saying the getter "documents" was called on null.
Widget getContent(BuildContext context) {
return StreamBuilder<QuerySnapshot>(
stream: Firestore.instance.collection("posts").snapshots(),
builder: (context, snap) {
return CarouselSlider(
enlargeCenterPage: true,
height: MediaQuery.of(context).size.height,
items: getItems(context, snap.data.documents),
);
},
);
}
List<Widget> getItems(BuildContext context, List<DocumentSnapshot>
docs){
return docs.map(
(doc) {
String content = doc.data["content"];
return Text(content);
}
).toList();
}
I expected to be delivered with the data in all documents, nut instead got this error:
I/flutter (30878): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (30878): The following NoSuchMethodError was thrown building StreamBuilder<QuerySnapshot>(dirty,
I/flutter (30878): dependencies: [MediaQuery], state: _StreamBuilderBaseState<QuerySnapshot,
I/flutter (30878): AsyncSnapshot<QuerySnapshot>>#72d38):
I/flutter (30878): The getter 'documents' was called on null.
I/flutter (30878): Receiver: null
I/flutter (30878): Tried calling: documents
I/flutter (30878): When the exception was thrown, this was the stack:
V/NativeCrypto(30878): Registering com/google/android/gms/org/conscrypt/NativeCrypto's 284 native methods...
I/flutter (30878): #0 Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:50:5)
I/flutter (30878): #1 PostsPageState.getContent.<anonymous closure>
package:reach_out_kef_global/main.dart:140
I/flutter (30878): #2 StreamBuilder.build
package:flutter/…/widgets/async.dart:423
I/flutter (30878): #3 _StreamBuilderBaseState.build
package:flutter/…/widgets/async.dart:125
I/flutter (30878): #4 StatefulElement.build
package:flutter/…/widgets/framework.dart:3825
I/flutter (30878): #5 ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:3736
I/flutter (30878): #6 Element.rebuild
package:flutter/…/widgets/framework.dart:3559
I/flutter (30878): #7 ComponentElement._firstBuild
package:flutter/…/widgets/framework.dart:3716
I/flutter (30878): #8 StatefulElement._firstBuild
package:flutter/…/widgets/framework.dart:3864
I/flutter (30878): #9 ComponentElement.mount
package:flutter/…/widgets/framework.dart:3711
I/flutter (30878): #10 Element.inflateWidget
package:flutter/…/widgets/framework.dart:2956
I/flutter (30878): #11 Element.updateChild
package:flutter/…/widgets/framework.dart:2759
I/flutter (30878): #12 ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:3747
I/flutter (30878): #13 Element.rebuild
package:flutter/…/widgets/framework.dart:3559
I/flutter (30878): #14 ComponentElement._firstBuild
package:flutter/…/widgets/framework.dart:3716
I/flutter (30878): #15 StatefulElement._firstBuild
package:flutter/…/widgets/framework.dart:3864
I/flutter (30878): #16 ComponentElement.mount
package:flutter/…/widgets/framework.dart:3711
...
PLEASE HELP!
You should check that the snapshot.data is not null before you call snapshot.data.documents. This is often the first thing I do in the build method of a stream builder. If the stream is empty, like it will be when it is first listened to but before firestore has returned the data being requested, the snapshot.data will be null. In that case you might want to show a container or a circular progress indicator:
Widget getContent(BuildContext context) {
return StreamBuilder<QuerySnapshot>(
stream: Firestore.instance.collection("posts").snapshots(),
builder: (context, snap) {
//just add this line
if(snap.data == null) return CircularProgressIndicator();
return CarouselSlider(
enlargeCenterPage: true,
height: MediaQuery.of(context).size.height,
items: getItems(context, snap.data.documents),
);
},
);
}
List<Widget> getItems(BuildContext context, List<DocumentSnapshot>
docs){
return docs.map(
(doc) {
String content = doc.data["content"];
return Text(content);
}
).toList();
}