Document Stream snapshot.hasData 返回 true 但没有数据,如何解决这个问题?
Posted
技术标签:
【中文标题】Document Stream snapshot.hasData 返回 true 但没有数据,如何解决这个问题?【英文标题】:Document Stream snapshot.hasData returns true but no data, how to fix this? 【发布时间】:2019-06-24 21:31:47 【问题描述】:我正在从 Firestore 流式传输文档快照,但是当数据库中没有任何内容时,snapshot.hasData 返回 true。这会导致我的代码在尝试从快照中检索值时失败。
我该如何解决这个问题?
我尝试打印出快照。数据刚刚得到一个 Documentsnapshot 实例。也想过给流提供初始数据,但是不知道怎么提供一个空的DocumentSnapshot数据类型。
如果我手动将记录插入到 Firestore,它可以正常工作。
StreamBuilder<DocumentSnapshot>(
stream: Firestore.instance.collection('UserDetails').document(widget.uid).snapshots(),
builder: (context, snapshot)
if(snapshot.hasError)
widget._err = snapshot.error;
else if (snapshot.connectionState == ConnectionState.waiting)
widget._loadingUserInfo = true;
else if (snapshot.hasData)
nameController.text = snapshot.data['name'];
ageController.text = snapshot.data['age'];
introController.text = snapshot.data['intro'];
widget._loadingUserInfo = false;
)
如果存在值或用户存在,我正在尝试从 Firestore 获取用户值以填充他们的表单。
现在它只是失败了。
【问题讨论】:
你没有返回任何东西给builder: (context, snapshot)
?
这里没有显示返回,这是一个很长的小部件。但我认为这不会影响任何事情:/
【参考方案1】:
在没有数据的情况下hasData
不可能返回true
。
hasData
只是以下的简写:
snapshot.data != null
这意味着您确实拥有数据。但可能不是您想要的数据。
【讨论】:
当我打印时(snapshot.hasData);我得到了假然后另一个真的跟进,也许是流媒体?我的数据库完全是空的。 我也有同样的情况。 hasData 为真,但没有数据。检查 (!snapshot.hasData || !snapshot.data.exists) 是否对我有用的解决方案hasData
返回 true,即使数据库中不存在该文档。即使snapshot.data == null
、hasData
返回 true。
在什么情况下你会认为空列表意味着有数据的列表?【参考方案2】:
为什么不添加验证?
类似
if (snapshot.hasData && (snapshot.data == null) return SizedBox();
此外,如果您正在检索列表,您可以检查 data != null and snapshot.data.length == 0;
【讨论】:
【参考方案3】:snapshot.hasData
将返回 true 对于空数据集,即:
snapshot.data = []
就我个人而言,我认为hasData
的意思是“有回应”。
【讨论】:
【参考方案4】:我发现虽然print( snapshot.hasData );
是真的,
print( snapshot.data.documents.isEmpty );
和 print( snapshot.data.exists );
也是如此..
因此,为了解决我的问题,我使用了:
if (!snapshot.hasData || snapshot.data.documents.isEmpty) //for QuerySnapshot
或
if (!snapshot.hasData || !snapshot.data.exists) //for DocumentSnapshot
【讨论】:
【参考方案5】:您可以尝试通过以下方式检查数据是否为空:if (snapshot.data == '[]') then
你的情况……
....
else if (snapshot.hasData && snapshot.data.toString() != '[]') then)
nameController.text = snapshot.data['name'];
ageController.text = snapshot.data['age'];
introController.text = snapshot.data['intro'];
widget._loadingUserInfo = false;
我花了一个小时才弄明白...
【讨论】:
【参考方案6】:造成混淆的原因是 Firestore 会返回 DocumentSnapshot
,即使数据库中没有要返回的内容。
FutureBuilder<DocumentSnapshot>(
future: firestore
.document('collection/non_existant_document')
.get(),
builder: (BuildContext context,
AsyncSnapshot<DocumentSnapshot> snapshot)
if (snapshot.hasData)
print('Has Data');
),
上面的代码返回一个空的DocumentSnapshot
。然而,由于它在data
中返回DocumentSnapshot
,所以hasData
的计算结果为真。
要检查DocumentSnapshot
是否包含数据,请使用
if (snapshot.data?.exists ?? false)
【讨论】:
以上是关于Document Stream snapshot.hasData 返回 true 但没有数据,如何解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章
StreamBuilder总是在flutter中的print(snapshot.hasData)中返回false
Could not parse mapping document from input stream hibernate配置异常