#android #firebase #flutter #google-cloud-firestore #mobile-application
#Android #firebase #flutter #google-облако-firestore #мобильное приложение
Вопрос:
Я использую flutter и firebase для создания мобильного приложения. У меня есть 2 коллекции в моем firestore, и я хочу прочитать все документы в коллекции «posts». Однако, когда я это делаю, появляется ошибка, в которой говорится, что средство получения «documents» было вызвано с нулевым значением.
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();
}
Я ожидал, что данные будут доставлены во всех документах, вместо этого nut получил эту ошибку:
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:
Вы должны проверить, что снимок.данные не равны нулю перед вызовом snapshot.data.documents. Часто это первое, что я делаю в методе сборки stream builder. Если поток пуст, как это будет при первом прослушивании, но до того, как firestore вернет запрашиваемые данные, снимок.данные будут равны нулю. В этом случае вы можете захотеть показать контейнер или круговой индикатор выполнения:
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();
}