所以每当我通过Google登录时,我都会得到以下错误,但我只在第一次登录时得到它。如果我退出并重新登录,它永远不会出现,应用程序运行正常。
======== Exception caught by widgets library =======================================================
The following StateError was thrown building:
Bad state: field does not exist within the DocumentSnapshotPlatform
When the exception was thrown, this was the stack:
#0 DocumentSnapshotPlatform.get._findKeyValueInMap (package:cloud_firestore_platform_interface/src/platform_interface/platform_interface_document_snapshot.dart:87:7)
#1 DocumentSnapshotPlatform.get._findComponent (package:cloud_firestore_platform_interface/src/platform_interface/platform_interface_document_snapshot.dart:105:23)
#2 DocumentSnapshotPlatform.get (package:cloud_firestore_platform_interface/src/platform_interface/platform_interface_document_snapshot.dart:121:12)
#3 _JsonDocumentSnapshot.get (package:cloud_firestore/src/document_snapshot.dart:92:48)
#4 _JsonDocumentSnapshot.[] (package:cloud_firestore/src/document_snapshot.dart:96:40)
#5 _HomeState.chatRoomsList.<anonymous closure>.<anonymous closure> (package:connectlyapp/views/home.dart:58:45)
#6 SliverChildBuilderDelegate.build (package:flutter/src/widgets/sliver.dart:456:22)
#7 SliverMultiBoxAdaptorElement._build (package:flutter/src/widgets/sliver.dart:1214:28)
#8 SliverMultiBoxAdaptorElement.createChild.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1227:55)
#9 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2573:19)
#10 SliverMultiBoxAdaptorElement.createChild (package:flutter/src/widgets/sliver.dart:1220:12)
#11 RenderSliverMultiBoxAdaptor._createOrObtainChild.<anonymous closure> (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:349:23)
#12 RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1968:59)
#13 PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:916:15)
#14 RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1968:14)
#15 RenderSliverMultiBoxAdaptor._createOrObtainChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:338:5)
#16 RenderSliverMultiBoxAdaptor.addInitialChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:422:5)
#17 RenderSliverList.performLayout (package:flutter/src/rendering/sliver_list.dart:79:12)
#18 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#19 RenderSliverEdgeInsetsPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:137:12)
#20 RenderSliverPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:371:11)
#21 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#22 RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:510:13)
#23 RenderShrinkWrappingViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1923:12)
#24 RenderShrinkWrappingViewport.performLayout (package:flutter/src/rendering/viewport.dart:1881:20)
#25 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#26 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#27 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#28 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#29 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#30 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#31 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#32 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#33 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#34 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#35 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#36 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#37 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#38 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#39 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#40 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#41 RenderCustomPaint.performLayout (package:flutter/src/rendering/custom_paint.dart:545:11)
#42 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#43 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#44 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#45 ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:56:11)
#46 RenderFlex._computeSizes (package:flutter/src/rendering/flex.dart:829:43)
#47 RenderFlex.performLayout (package:flutter/src/rendering/flex.dart:931:32)
#48 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#49 _RenderSingleChildViewport.performLayout (package:flutter/src/widgets/single_child_scroll_view.dart:581:14)
#50 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#51 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#52 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#53 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#54 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#55 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#56 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#57 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#58 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#59 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#60 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#61 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#62 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#63 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#64 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#65 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#66 RenderCustomPaint.performLayout (package:flutter/src/rendering/custom_paint.dart:545:11)
#67 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#68 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#69 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#70 RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:233:12)
#71 RenderObject.layout (package:flutter/src/rendering/object.dart:1858:7)
#72 MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:171:12)
#73 _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:1097:7)
#74 MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:240:7)
#75 RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:404:14)
#76 RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1713:7)
#77 PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:885:18)
#78 RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:453:19)
#79 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:883:13)
#80 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:319:5)
#81 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1143:15)
#82 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1080:9)
#83 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:996:5)
#87 _invoke (dart:ui/hooks.dart:166:10)
#88 PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:270:5)
#89 _drawFrame (dart:ui/hooks.dart:129:31)
(elided 3 frames from dart:async)
====================================================================================================
这是错误弹出的代码:
Widget chatRoomsList() {
return StreamBuilder<dynamic>(
stream: chatRoomsStream,
builder: (context, snapshot) {
return snapshot.hasData
? ListView.builder(
itemCount: snapshot.data.docs.length,
shrinkWrap: true,
itemBuilder: (context, index) {
DocumentSnapshot ds = snapshot.data.docs[index];
return ChatRoomListTile(ds["lastMessage"], ds.id, myUserName);
})
: Center(child: CircularProgressIndicator());
},
);
}
这段代码的作用是在主页上获取登录用户与之交互的聊天室。有点像信使主界面。但是,如果一个新用户登录(他没有聊天室或与任何其他用户已有聊天记录),主屏幕应该没有显示任何结果。
我在这里做错了什么?我在同一应用程序上的搜索功能也有类似的问题,我通过返回Streambuilder来修复它,但在这里-这并不能修复坏状态错误。
如果我退出并重新登录,主屏幕工作正常,它显示与我聊天的用户以及他们之前/最后发送的消息。
请帮我一下。
编辑:getChatRooms() [where chatRoomsStream被初始化]:
getChatRooms() async {
chatRoomsStream = await DatabaseMethods().getChatRooms();
setState(() {});
}
.getChatRoomsDatabaseMethods()()(数据库。飞镖方法]:
Future<Stream<QuerySnapshot>> getChatRooms() async {
String myUsername = await SharedPreferenceHelper().getUserName();
return FirebaseFirestore.instance
.collection("chatrooms")
.where("users", arrayContains: myUsername)
.snapshots();
}
我认为问题出在这一行
return ChatRoomListTile(ds["lastMessage"], ds.id, myUserName);
尝试将这行更改为ds.data()['lastMessage']
return ChatRoomListTile(ds.data()['lastMessage'], ds.id, myUserName);
适合我的代码
final usersRef = FirebaseFirestore.instance.collection('users');
final userDocs = await usersRef.get();
final docId =
userDocs.docs.where((doc) => doc.data()['uid'] == user.uid).first.id;
如果您有任何问题,请在评论中告诉我,我很乐意帮助您。
你应该使用doc.data(),但是一旦你使用它,你会得到一个错误,说操作符[]没有为Object类型定义。这是因为在最新版本的firestoredocument是泛型类型你必须同时给出一个类型示例
DocumentSnapshot<Map<String,dynamic>>
如果你没有给出任何类型——DocumentSnapshot
。该类型被推断为对象类型,不需要定义"[]"
操作符。
更多细节请看这两个答案https://stackoverflow.com/a/63501611/6051666https://stackoverflow.com/a/69447502/6051666