错误状态: DocumentSnapshotPlatform 中不存在字段。它显示在 null 上调用了 getter

Posted

技术标签:

【中文标题】错误状态: DocumentSnapshotPlatform 中不存在字段。它显示在 null 上调用了 getter【英文标题】:Bad state: field does not exist within the DocumentSnapshotPlatform . It shows the getter was called on null 【发布时间】:2021-03-12 03:45:50 【问题描述】:

相关的导致错误的小部件是 流生成器。我已经在 github 中给出了项目 repo 的链接。

Widget build(BuildContext context) 
return StreamBuilder(
  stream: FirebaseFirestore.instance
      .collection("/chats/2DGQmBssJ4sU6MVJZYc0/messages")
      .orderBy('createdAt', descending: true)
      .snapshots(),
  builder: (context, snapshot) 
    if (snapshot.connectionState == ConnectionState.waiting)
      Center(child: CircularProgressIndicator());
    final documents = snapshot.data.documents;
    return ListView.builder(
      reverse: true,
      itemCount: documents.length,
      itemBuilder: (context, index) 
        return MessageBubble(
            documents[index]['text'],
            documents[index]['userID'] == user.uid,
            documents[index]['userID'],
            documents[index]['imageurl']);
      ,
    );
  ,
);

Github link of the project

【问题讨论】:

【参考方案1】:

尝试以下方法:

 if (snapshot.connectionState == ConnectionState.waiting)
      Center(child: CircularProgressIndicator());
 else if(snapshot.connectionState == ConnectionState.active)
    final documents = snapshot.data.documents;
    return ListView.builder(
      reverse: true,
      itemCount: docs.length,
      itemBuilder: (context, index) 
        return MessageBubble(
            docs[index]['text'],
            docs[index]['userID'] == user.uid,
            docs[index]['userID'],
            docs[index]['imageurl']);
       ,
     );
   ,
  ,
);

当connectionState 为active 表示数据为非null 时,检索数据。也请使用docs,因为您似乎使用的是新版本的 Firestore。

documents 变成了docs

【讨论】:

最后我应该返回什么?因为需要一个小部件作为回报。 return Center(child: CircularProgressIndicator());【参考方案2】:

编辑

现在我变得比以前好一点,所以我必须更新这个答案以便更好地理解。

让我们以上面的例子为例:

 return ListView.builder(
      reverse: true,
      itemCount: documents.length,
      itemBuilder: (context, index) 
        return MessageBubble(
            documents[index]['text'],
            documents[index]['userID'] == user.uid,
            documents[index]['userID'],
            documents[index]['imageurl']);
      ,
    );
  ,
);

这里,该特定集合中的所有文档必须包含这 3 个字段,即'text''userID''imageurl',才能在 listView.builder() 中成功构建每个子项。

但是,如果这 3 个字段中的任何一个字段缺失,甚至在一个或多个文档中拼写错误,则会引发类似上述的错误。

会抛出错误:

会抛出错误:

所以,为了解决这个问题,我们需要找到那个字段缺失或字段拼写错误的特定文档并更正它。

或者,删除该文档并仅保留那些具有正确字段的文档。

(顺便说一句,我正在使用“Dark Reader”chrome 扩展来为 firebase 控制台和互联网上的所有其他网站提供深色主题。)

我的旧答案:

在我的情况下,我将 Firebase Firestore 用于我的聊天应用程序,在加载聊天屏幕时,我收到了这个错误。

所以在 Firestore 数据库中我有 15-20 条消息,所以我删除了其中的大部分,只留下 2-3 条消息。然后错误消失了。

我不知道这里发生了什么。

【讨论】:

【参考方案3】:

您创建了一个小部件,然后不使用它并继续执行其余的逻辑:

if (snapshot.connectionState == ConnectionState.waiting)
     Center(child: CircularProgressIndicator());

您需要停在那里并从您的构建器返回该小部件:

if (snapshot.connectionState == ConnectionState.waiting)
     return Center(child: CircularProgressIndicator());

【讨论】:

我试过了,但现在它只是一个空白的白色屏幕。进度指示器正在工作,但是当连接处于活动状态时。它不会返回 StreamBuilder 构建的内容

以上是关于错误状态: DocumentSnapshotPlatform 中不存在字段。它显示在 null 上调用了 getter的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 插入错误,状态:挂起,状态码 5

错误:错误状态:DocumentSnapshotPlatform 中不存在字段

传递状态时 Apollo Query 变量错误

Shell命令的退出状态及错误检查

摆动输入元素的错误状态[关闭]

材质 UI 步进器组件错误状态显示不需要的图标