坏状态:仅在第一次加载时,在Flutter中的DocumentSnapshotPlatform中不存在字段



所以每当我通过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

相关内容

  • 没有找到相关文章

最新更新