flutter - Flutter StreamBuilder connectionState问题与firestore
问题描述
我在下面得到了这段代码,我在这里面临的问题是,至少在页面加载时,connectionState 似乎总是显示“false”。我在firestore上有“myValue”值,在“items”的子集合“subItem”下,有些项目已经创建了这个subCollection并且hasData,但有些没有。
Widget build(BuildContext context) {
return StreamBuilder(
stream:Firestore.instance
.collection('other')
.document(documentID)
.snapshots(),
builder: (context, streamSnapshot1) {
return StreamBuilder(
stream: Firestore.instance
.collection('items')
.document(documentID)
.collection('subItems')
.document(userUID)
.snapshots(),
builder: (context, streamSnapshot2) {
return _detailPage(context, streamSnapshot2)
});
}
});
}
Widget _detailPage(context, streamSnapshot1, streamSnapshot2) {
var myValue = (streamSnapshot2.connectionState != true) ? 1
: (streamSnapshot2.hasData) ? streamSnapshot2.data['myValue']: 2;
print(myValue);
return Scaffold(etc)
}
在这种情况下,“myValue”总是打印“1”。它是否对 Firestore 有价值。当我打印connectionState时,它会显示“connectionState.waiting”一段时间,然后更改为“connectionState.active”。最初显示的 'connectionState.waiting' 是 firestore 流的已知行为,但即使将其更改为活动状态,它仍然会考虑 'streamSnapshot2.connectionState != true' 并返回 '1'。是否应该将“connectionState.done”视为“streamSnapshot2.connectionState == true”?但它永远不会更改为“connectionStat.done”。
当我尝试不使用“connectionState”并且只使用 hasData 检查时,
var myValue = (streamSnapshot2.hasData) ? streamSnapshot2.data['myValue']: 2;
当项目中已经有“subItems”子集合和数据时,它可以显示存储在 firestore 上的“myValue”的正确值。但在这种情况下,应用程序会在尚未创建“subItem”子集合的项目中中断。带有以下错误消息。
error: The method '[]' was called on null.
这是因为 'streamSnapshot.data' 仍然为空。我也无法理解这一点,因为虽然没有数据,因此它为空,但它通过了 (streamSnapshot2.hasData == true) 条件。
这里有什么问题?
解决方案
connectionState 永远不会等于 true,因为它根本不是布尔值。正如您所注意到的,它是一个 ConnectionState 枚举值,因此如果您想检查 AsyncSnapshot 的 connectionState,您必须将其与 ConnectionsState 枚举值进行比较。因此,例如,如果您想知道流是否已加载,则需要检查状态是否与等待不同:(您已经使用 print 语句自己观察了它)
if(streamSnapshot1.connectionState
!= ConnectionState.waiting) {
//stream has loaded some first values
}
推荐阅读
- sql - 我想在不同的查询中使用动态结果
- c - Linux timer_settime() 产生分段错误
- ios - “为 iOS 构建,但嵌入式框架 'xxx.framework' 是为 iOS + iOS 模拟器构建的”
- spring - Spring 云服务器无法从 loacl 文件系统中读取
- ansible - Ansible 逻辑在某些情况下具有相同的用户 sudo 而在其他情况下正常
- amazon-redshift - 将 2 个分区文件夹合并到一个表中
- javascript - 应用程序缓存错误事件:无法将新缓存提交到存储
- java - OpenJDK 中使用的代码模板系统是什么?它是如何工作的?
- excel - 将数字 1-12 分配给另一组数字,当达到 12 时,再次从 1 开始下一个数字并继续
- javascript - 如何使用 jquery ajax 在 swiper 滑块中显示动态数据?