【问题标题】:Bad state: field does not exist within the DocumentSnapshotPlatform in Flutter on first load only错误状态:仅在首次加载时 Flutter 中的 DocumentSnapshotPlatform 中不存在字段
【发布时间】:2021-10-08 04:26:39
【问题描述】:

因此,每当我通过 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());
      },
    );
  }

这段代码的作用是在主页上获取登录用户与之交互的聊天室。有点像 Messenger 主屏幕。但是,如果新用户登录(没有聊天室或与任何其他用户的现有聊天),主屏幕应该不会显示任何结果。

我在这里做错了什么?我在同一个应用程序上的搜索功能遇到了类似的问题,我通过返回 Streambuilder 来修复它,但是在这里 - 这并不能修复 Bad state 错误。

如果我注销并重新登录,主屏幕可以正常工作,它会显示我与之聊天的用户以及他们之前/最后发送的消息。

请帮帮我。

编辑: getChatRooms() [chatRoomsStream 的初始化位置]

    getChatRooms() async {
    chatRoomsStream = await DatabaseMethods().getChatRooms();
    setState(() {});
  }

DatabaseMethods().getChatRooms() [database.dart 方法]

Future<Stream<QuerySnapshot>> getChatRooms() async {
    String myUsername = await SharedPreferenceHelper().getUserName();
    return FirebaseFirestore.instance
        .collection("chatrooms")
        .where("users", arrayContains: myUsername)
        .snapshots();
  }

【问题讨论】:

  • 请分享chatRoomsStream的代码,这可能有助于我们理解问题。
  • 我已经编辑了主帖并更新了代码sn-ps,请看一下。

标签: flutter dart google-cloud-firestore


【解决方案1】:

我认为问题出在这一行

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;

如果您有任何问题,请在 cmets 中告知,我们很乐意为您提供帮助。

【讨论】:

  • 这是我在添加 ds.data()['lastMessage'] => 时遇到的错误
  • 只是想确保您拥有lastMessage 属性,并且具有正确的单词和正确的路径
  • 另外,试试这个ds.get('lastMessage')而不是这个ds.data()['lastMessage']
  • 我已经仔细检查了属性名称,它是正确的。也试过get(),还是一样的badstate错误。
  • 至少在我的代码中我这样做对我有用final usersRef = FirebaseFirestore.instance.collection('users');final userDocs = await usersRef.get();final docId =userDocs.docs.where((doc) =&gt; doc.data()['uid'] == user.uid).first.id;
【解决方案2】:

你应该使用 doc.data() 但是一旦你使用它你会得到一个错误,说 operator[] 没有为类型 Object 定义。这是因为在最新版本的 firestore Document 中,它是一个泛型类型,您还必须给出一个类型以及它的示例

DocumentSnapshot<Map<String,dynamic>> 

如果您不提供这样的任何类型 - DocumentSnapshot 。该类型被推断为不应该定义 "[]" 运算符的 Object 类型。

请查看这两个答案以获取更多详细信息- https://stackoverflow.com/a/63501611/6051666 https://stackoverflow.com/a/69447502/6051666

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-16
    • 2021-09-28
    • 2021-09-27
    • 2022-09-27
    • 2021-03-05
    • 1970-01-01
    • 2021-10-26
    • 2021-05-19
    相关资源
    最近更新 更多