flutter - Flutter:返回时在 Firestore 中获取我的数据数组时输出不稳定
问题描述
在获取我的数据数组时,我的反应非常不稳定。我在卡片列表中显示这些数据。我说不稳定,因为每次我在我的应用程序中转到另一个导航时,我都会回到输出数据的那个导航。它首先显示红色背景,然后显示数据一百万秒。有人知道怎么修这个东西吗?我只是flutter / android的新手。请帮忙。
对于红色背景,它在终端上显示并输出我得到的数据。
The following NoSuchMethodError was thrown building StreamBuilder<QuerySnapshot>(dirty, state: _StreamBuilderBaseState<QuerySnapshot, AsyncSnapshot<QuerySnapshot>>#dac03):
The getter 'documents' was called on null.
Receiver: null
Tried calling: documents
我的代码:
StreamBuilder<QuerySnapshot>(
stream: db.collection('ACTIVITIES').snapshots(),
builder: (context, snapshot) {
final issuesList = snapshot.data.documents
.map((doc) => doc['Issue'].map<Widget>((issue) => buildItem(issue)).toList())
.toList();
return Column(
children: issuesList.expand<Widget>((issue) => issue).toList()
);
})
我的数据库结构:
请帮忙。
解决方案
您面临的问题是内部StreamBuilder
,snapshot.data
是null
然后数据到达。这就是为什么您看到带有错误的红屏然后它可以正常工作的原因。
首先,当你使用 a 时,StreamBuilder
你应该检查是否snapshot.data
有东西,然后开始使用数据。你可以snapshot.hasData
像这样使用:
StreamBuilder<QuerySnapshot>(
stream: db.collection('ACTIVITIES').snapshots(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return Column(...);
}
return Text('Loading...');
},
)
有了这个,您现在将看到'Loading...'
错误的红色屏幕而不是红色屏幕,当数据到达时,您将正常看到数据。
现在,当您转到另一个屏幕并返回时,该build()
方法再次触发,并且StreamBuilder
将再次从流中获取数据。即使 Firestore 缓存了数据,也可能需要一段时间才能使用,以便您获取null
,然后缓存的数据就会到达。它不会像第一次那样花费太长时间,但您可能会看到'Loading...'
。
为避免'Loading...'
在您第一次收到数据后显示,您可以使用内存缓存并将其设置为initialData
on StreamBuilder
,如下所示:
QuerySnapshot cache; // declare this outside build()
StreamBuilder<QuerySnapshot>(
initialData: cache,
stream: db.collection('ACTIVITIES').snapshots(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return Column(...);
}
cache = snapshot.data;
return Text('Loading...');
},
)
有了这个,我认为你可以解决你的问题。如果您想查看更多建议,请查看:如何在 Flutter 中缓存 Firebase 数据?
推荐阅读
- javascript - 如何在 Sequelize 模型中制作临时对象?
- python - Python discord bot 使用 discord.py 问题
- python - 在文本挖掘中合并 int64 和对象列
- mysql - Sequelize 条件模型包括
- flutter - 使用http解析飞镖颤振中的产品列表时出错
- python - Python AWS Lambda 错误“libgomp.so.1:无法打开共享对象文件:没有这样的文件或目录”来自安装在 Ubuntu 上的 AWS EFS 文件系统
- android - ViewModelProvider.AndroidViewModelFactory 与新的 ViewModelProvider
- mobile - 每种支付方式(支票、信用卡、ACH、现金)可通过手机收取的最大金额是否有限制?
- authentication - GCP 实例不通过 ssh 登录
- angular - 按 json 字段过滤 Angular 数组