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 == nullhasData 返回 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

Stream computing

dos中使用java -jar xxx.jar报错

Could not parse mapping document from input stream hibernate配置异常

Could not parse mapping document from input stream

即使 Flutter 应用程序在后台,如何自动响应 Firebase Document Stream 更新? [关闭]