Home > front end >  Bad state: field does not exist within the DocumentSnapshotPlatform in Flutter on first load only
Bad state: field does not exist within the DocumentSnapshotPlatform in Flutter on first load only

Time:10-08

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

  • Related