firebase - 属性 'docs' 不能无条件访问,因为接收到的可能是 'null' Flutter
问题描述
迁移到 null-safety 后显示此错误。我现在该怎么办?
Widget chatMessages() {
return StreamBuilder(
stream: messageStream,
builder: (context, snapshot) {
return snapshot.hasData
? ListView.builder(
padding: EdgeInsets.only(bottom: 70, top: 16),
itemCount: snapshot.data.docs.length,
reverse: true,
itemBuilder: (context, index) {
DocumentSnapshot ds = snapshot.data.docs[index];
return chatMessageTitle(
ds["message"], myUserName == ds["sendBy"]);
})
: Center(child: CircularProgressIndicator());
});
}
添加显示此错误的空检查 (!) 后<the getter 'docs' is not defined for the type of object>
itemCount: snapshot.data!.docs.length,
reverse: true,
itemBuilder: (context, index) {
DocumentSnapshot ds = snapshot.data!.docs[index];
解决方案
您必须转换snapshot.data
为它的类型。假设类型是QuerySnapshot
(将其更改为 的实际类型snapshot.data
)。
(snapshot.data! as QuerySnapshot).docs.length
我们可以stream
在StreamBuilder
.
StreamBuilder<QuerySnapshot>(
...
);
现在snapshot.data
推断为QuerySnapshot
不需要类型转换。
snapshot.data!.docs.length
推荐阅读
- java - 在不调用 get() 的情况下检测 Java Future 上的超时异常
- javascript - 未使用的 div 出现在反应谷歌地图上,我无法设置它的样式
- javascript - 继续循环一个函数,直到里面的回调解析为真
- sql - 获取用户使用特定优惠的次数
- r - 在 R 中安装测试套件中使用的所有软件包?
- sql - Postgresql 多对多表的最佳搜索方式 - 排除和包含标签
- django - 在django的表单的action中设置输入字段的值
- eclipse - 从 Eclipse Selenium Java 中的控制台获取 HTML 中的所有表单标签
- javascript - html数字只有最小值和最大值
- javascript - 带有 jquery 日期时间选择器的 ASP Web 应用程序问题