【问题标题】:Document Stream snapshot.hasData returns true but no data, how to fix this?Document Stream snapshot.hasData 返回 true 但没有数据,如何解决这个问题?
【发布时间】: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) ?
  • 这里没有显示返回,这是一个很长的小部件。但我认为这不会影响任何事情:/

标签: firebase stream flutter google-cloud-firestore


【解决方案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) {}
          

          【讨论】:

            猜你喜欢
            • 2021-06-11
            • 1970-01-01
            • 1970-01-01
            • 2023-03-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多