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

守給你的承諾、 提交于 2021-01-03 06:26:07

问题


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!


回答1:


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


来源:https://stackoverflow.com/questions/55553839/how-to-fix-getter-documents-was-called-on-null-in-flutter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!