将Firebase的数据显示为Flutter错误



我一直试图将firebase数据库中的数据显示到Flutter应用程序中,但不断出现错误,有人知道原因和解决方案吗?当我添加了一个检查快照是否有数据的检查时,我过去不会出错,我编程为在没有数据的情况下只显示Container((。然而,当我后来尝试添加orderBy查询时,我意识到了这个错误,因为我被认为在数据库的复合索引链接中收到了一个错误,但没有收到,所以我一整天都在尝试很多方法,我发现之前一定有错误,所以当我取消检查快照是否有数据时,这个错误就显示了,所以我必须先解决这个问题,才能转到orderBy部分。非常感谢。这是代码

class ChatBody extends StatefulWidget {
ChatScreenState createState() => ChatScreenState();
}
class ChatScreenState extends State<ChatBody> {
Stream messageStream;
String chatRoomId;
String myUser;
@override
void initState() {
super.initState();
_getMyUserID().then((value) {
setState(() {
myUser = value;
doThisOnLaunch(value);
});
});
}
//Gets my User ID
_getMyUserID() async {
final myUserId = await getUser();
var myUserVar = myUserId;
return myUserVar;
}
doThisOnLaunch(String myUserId) {
getAndDisplayChats(myUserId);
}
// Function to get the messages from the firebase database and set it to the Stream to be able to build a real time StreamBuilder
getAndDisplayChats(String myUserId) async {
// print(myUserId);
messageStream = await DatabaseMethods().getChatList(myUserId);
}
textTest() {
return StreamBuilder(
stream: messageStream,
builder: (context, snapshot) {
return ListView.builder(
itemCount: snapshot.data.docs.length,
itemBuilder: (context, index) {
DocumentSnapshot ds = snapshot.data.docs[index];
return chatList(
ds["userName"],
);
},
);
},
);
}
chatList(
String userName,
) {
return Container(
child: Text(userName),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("HELOOO!"),
),
body: textTest(),
);
}
//Top Nav Bar Actions Selection
void choiceAction(String choice) {
choice == Constants.AddContacts
? Navigator.push(
context,
MaterialPageRoute(
builder: (context) => AddFriendsPage(),
),
)
: choice == Constants.CreateGroup
? Navigator.push(
context,
MaterialPageRoute(
builder: (context) => NewGroupPage(),
),
)
: print("no return");
}
}

以下是从Firebase 获取数据的代码

getChatList(String myUser) {
return FirebaseFirestore.instance
.collection("chatRoom")
.where("users", arrayContains: myUser)
.snapshots();
}

这是错误消息

══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY
╞═══════════════════════════════════════════════════════════
The following NoSuchMethodError was thrown building StreamBuilder<dynamic>(dirty, state:
_StreamBuilderBaseState<dynamic, AsyncSnapshot<dynamic>>#0d43b):
The getter 'docs' was called on null.
Receiver: null
Tried calling: docs
The relevant error-causing widget was:
StreamBuilder<dynamic>
file:///Users/vinpc/Development/projects/chat_app/lib/Screens/Home/Screens/TheChat/components/body.dart:62:12
When the exception was thrown, this was the stack:
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:54:5)
#1      ChatScreenState.textTest.<anonymous closure>
(package:chat_app/Screens/Home/Screens/TheChat/components/body.dart:66:36)
#2      StreamBuilder.build (package:flutter/src/widgets/async.dart:546:81)
#3      _StreamBuilderBaseState.build (package:flutter/src/widgets/async.dart:124:48)
#4      StatefulElement.build (package:flutter/src/widgets/framework.dart:4691:27)
#5      ComponentElement.performRebuild
(package:flutter/src/widgets/framework.dart:4574:15)
#6      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4746:11)
#7      Element.rebuild (package:flutter/src/widgets/framework.dart:4267:5)
#8      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4553:5)
#9      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4737:11)
#10     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4548:5)
...     Normal element mounting (19 frames)
#29     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3611:14)
#30     MultiChildRenderObjectElement.inflateWidget
(package:flutter/src/widgets/framework.dart:6221:36)
#31     MultiChildRenderObjectElement.mount
(package:flutter/src/widgets/framework.dart:6232:32)
...     Normal element mounting (105 frames)
#136    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3611:14)
#137    Element.updateChild (package:flutter/src/widgets/framework.dart:3363:18)
#138    SliverMultiBoxAdaptorElement.updateChild
(package:flutter/src/widgets/sliver.dart:1241:37)
#139    SliverMultiBoxAdaptorElement.createChild.<anonymous closure>
(package:flutter/src/widgets/sliver.dart:1226:20)
#140    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2535:19)
#141    SliverMultiBoxAdaptorElement.createChild
(package:flutter/src/widgets/sliver.dart:1219:12)
#142    RenderSliverMultiBoxAdaptor._createOrObtainChild.<anonymous closure>
(package:flutter/src/rendering/sliver_multi_box_adaptor.dart:349:23)
#143    RenderObject.invokeLayoutCallback.<anonymous closure>
(package:flutter/src/rendering/object.dart:1889:59)
#144    PipelineOwner._enableMutationsToDirtySubtrees
(package:flutter/src/rendering/object.dart:912:15)
#145    RenderObject.invokeLayoutCallback
(package:flutter/src/rendering/object.dart:1889:14)
#146    RenderSliverMultiBoxAdaptor._createOrObtainChild
(package:flutter/src/rendering/sliver_multi_box_adaptor.dart:338:5)
#147    RenderSliverMultiBoxAdaptor.addInitialChild
(package:flutter/src/rendering/sliver_multi_box_adaptor.dart:422:5)
#148    RenderSliverFixedExtentBoxAdaptor.performLayout
(package:flutter/src/rendering/sliver_fixed_extent_list.dart:205:12)
#149    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#150    RenderSliverEdgeInsetsPadding.performLayout
(package:flutter/src/rendering/sliver_padding.dart:137:12)
#151    _RenderSliverFractionalPadding.performLayout
(package:flutter/src/widgets/sliver_fill.dart:167:11)
#152    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#153    RenderViewportBase.layoutChildSequence
(package:flutter/src/rendering/viewport.dart:510:13)
#154    RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1574:12)
#155    RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1483:20)
#156    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#157    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#158    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#159    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#160    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#161    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#162    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#163    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#164    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#165    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#166    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#167    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#168    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#169    MultiChildLayoutDelegate.layoutChild
(package:flutter/src/rendering/custom_layout.dart:171:12)
#170    _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:937:7)
#171    MultiChildLayoutDelegate._callPerformLayout
(package:flutter/src/rendering/custom_layout.dart:240:7)
#172    RenderCustomMultiChildLayoutBox.performLayout
(package:flutter/src/rendering/custom_layout.dart:404:14)
#173    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#174    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#175    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#176    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#177    _RenderCustomClip.performLayout
(package:flutter/src/rendering/proxy_box.dart:1369:11)
#178    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#179    MultiChildLayoutDelegate.layoutChild
(package:flutter/src/rendering/custom_layout.dart:171:12)
#180    _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:937:7)
#181    MultiChildLayoutDelegate._callPerformLayout
(package:flutter/src/rendering/custom_layout.dart:240:7)
#182    RenderCustomMultiChildLayoutBox.performLayout
(package:flutter/src/rendering/custom_layout.dart:404:14)
#183    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#184    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#185    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#186    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#187    _RenderCustomClip.performLayout
(package:flutter/src/rendering/proxy_box.dart:1369:11)
#188    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#189    MultiChildLayoutDelegate.layoutChild
(package:flutter/src/rendering/custom_layout.dart:171:12)
#190    _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:937:7)
#191    MultiChildLayoutDelegate._callPerformLayout
(package:flutter/src/rendering/custom_layout.dart:240:7)
#192    RenderCustomMultiChildLayoutBox.performLayout
(package:flutter/src/rendering/custom_layout.dart:404:14)
#193    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#194    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#195    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#196    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#197    _RenderCustomClip.performLayout
(package:flutter/src/rendering/proxy_box.dart:1369:11)
#198    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#199    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#200    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#201    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#202    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#203    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#204    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#205    ChildLayoutHelper.layoutChild
(package:flutter/src/rendering/layout_helper.dart:54:11)
#206    RenderStack._computeSize (package:flutter/src/rendering/stack.dart:570:43)
#207    RenderStack.performLayout (package:flutter/src/rendering/stack.dart:597:12)
#208    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#209    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#210    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#211    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#212    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#213    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#214    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#215    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#216    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#217    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#218    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#219    RenderOffstage.performLayout (package:flutter/src/rendering/proxy_box.dart:3368:14)
#220    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#221    RenderProxyBoxMixin.performLayout
(package:flutter/src/rendering/proxy_box.dart:116:14)
#222    RenderObject.layout (package:flutter/src/rendering/object.dart:1779:7)
#223    _RenderTheatre.performLayout (package:flutter/src/widgets/overlay.dart:743:15)
#224    RenderObject._layoutWithoutResize
(package:flutter/src/rendering/object.dart:1636:7)
#225    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:881:18)
#226    RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:462:19)
#227    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:876:13)
#228    RendererBinding._handlePersistentFrameCallback
(package:flutter/src/rendering/binding.dart:328:5)
#229    SchedulerBinding._invokeFrameCallback
(package:flutter/src/scheduler/binding.dart:1144:15)
#230    SchedulerBinding.handleDrawFrame
(package:flutter/src/scheduler/binding.dart:1082:9)
#231    SchedulerBinding._handleDrawFrame
(package:flutter/src/scheduler/binding.dart:998:5)
#235    _invoke (dart:ui/hooks.dart:163:10)
#236    PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:259:5)
#237    _drawFrame (dart:ui/hooks.dart:126:31)
(elided 3 frames from dart:async)
═══════════════════════════════════════════════════════════════════════════════════════════
═════════
Another exception was thrown: NoSuchMethodError: The getter 'docs' was called on null.
Another exception was thrown: NoSuchMethodError: The getter 'docs' was called on null.

您必须使用[]用于arrayContainers

getChatList(String myUser) {
return FirebaseFirestore.instance
.collection("chatRoom")
.where("users", arrayContains: [myUser])
.snapshots();

}

在使用可能为null的.data属性之前,您应该添加一个检查,以了解快照是否有数据。

将您的textTest()方法更新为:

textTest() {
return StreamBuilder(
stream: messageStream,
builder: (context, snapshot) {
if (snapshot.data == null) {
return Container(); // Or CircularProgressIndicator();
}
return ListView.builder(
itemCount: snapshot.data.docs.length,
itemBuilder: (context, index) {
DocumentSnapshot ds = snapshot.data.docs[index];
return chatList(
ds["userName"],
);
},
);
},
);
}

最新更新