Как исправить 'получатель' документов 'был назван нулевым.' в трепетании - PullRequest
0 голосов
/ 07 апреля 2019

Я использую Flutter и Firebase для создания мобильного приложения. У меня есть 2 коллекции на моем камине, и я хочу прочитать все документы в коллекции "сообщения". Однако, когда я делаю это, ошибка, говорящая, что "документы" получателя были вызваны на нуль.

    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/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
...

ПОЖАЛУЙСТА, ПОМОГИТЕ!

1 Ответ

0 голосов
/ 07 апреля 2019

Перед вызовом snapshot.data.documents вы должны убедиться, что snapshot.data не имеет значение null.Часто это первое, что я делаю в методе сборки потокового компоновщика.Если поток пустой, как это будет при первом прослушивании, но до того, как firestore вернет запрашиваемые данные, snapshot.data будет нулевым.В этом случае вы можете показать контейнер или круговой индикатор прогресса:

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