我一直试图将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"],
);
},
);
},
);
}