How to fix 'getter "documents" was called on null.' in flutter

Udasi Tharani picture Udasi Tharani · Apr 6, 2019 · Viewed 12k times · Source

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!

Answer

Kris picture Kris · Apr 7, 2019

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();
}