错误状态: 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的主要内容,如果未能解决你的问题,请参考以下文章