So I get the following error whenever I sign in through Google, but I only get it on my first login. If I log out and log back in, it never appears and the app works fine.
======== 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)
====================================================================================================
This is the code that the error pops up on:
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());
},
);
}
What this snippet of code does is fetch chatrooms that the logged in user has interacted with, on the main page. Sort of like a Messenger Home screen. But if a new user logs in (who has no chatrooms or existing chats with any other user), the main screen should show no results.
What am I doing wrong here? I had a similar problem with my search feature on the same app, and I fixed it by putting in return Streambuilder, but here - that doesn't fix the Bad state error.
The main screen works fine if I log out and log back in, it displays the users I chatted with and their previous/last sent messages.
Kindly help me out here.
EDIT: getChatRooms() [where chatRoomsStream is initialized]:
getChatRooms() async {
chatRoomsStream = await DatabaseMethods().getChatRooms();
setState(() {});
}
DatabaseMethods().getChatRooms() [database.dart method]:
Future<Stream<QuerySnapshot>> getChatRooms() async {
String myUsername = await SharedPreferenceHelper().getUserName();
return FirebaseFirestore.instance
.collection("chatrooms")
.where("users", arrayContains: myUsername)
.snapshots();
}
CodePudding user response:
I believe the issue is in this line
return ChatRoomListTile(ds["lastMessage"], ds.id, myUserName);
try changing this line to ds.data()['lastMessage']
return ChatRoomListTile(ds.data()['lastMessage'], ds.id, myUserName);
Code that worked for me
final usersRef = FirebaseFirestore.instance.collection('users');
final userDocs = await usersRef.get();
final docId =
userDocs.docs.where((doc) => doc.data()['uid'] == user.uid).first.id;
Please lemme know in comments if you any issues, will be glad to help you.
CodePudding user response:
You should use doc.data() but once you use it you will get an error saying operator[] isn't defined for the type Object. That's because in recent version of firestore Document is a generic type and you must also give a type along with it example
DocumentSnapshot<Map<String,dynamic>>
if you don't give any type like this - DocumentSnapshot
.The type is inferred as an Object type that doesn't suppose to have "[]"
operator defined.
Please look at these two answers for more details- https://stackoverflow.com/a/63501611/6051666 https://stackoverflow.com/a/69447502/6051666