如何从Firestore中的文档获取字段值

时间:2020-05-19 22:39:43

标签: firebase flutter google-cloud-firestore

因此,我学习了如何在Firebase Firestore云中创建和更新文档,但是我在读取数据时遇到了麻烦。随附的是我用于查找“ photourl”字段值的代码:

String photoy; 
Firestore.instance.collection('userdata').document('sepDGexTRuRkpx1WQYylDDmUI573')
.get().then((DocumentSnapshot ds){
          photoy=ds.data['photourl'];      
});

  setState(() {
              photourldisplay=photoy;
             });   

但是,在运行程序时,photourldisplay值似乎没有更改,并且在运行时保持为空。这意味着检索我的“ photourl”字段的代码有些歪斜。有人可以帮助我检索Firebase文档中的字段吗? Firebase Documents Firebase security rules

2 个答案:

答案 0 :(得分:2)

photoy不包含您期望的值,因为Firestore查询是异步的。 get()立即返回,并在查询完成后的一段时间后调用回调。无法保证查询会花费多长时间。如果您想将photoy的值传递给其他值,则必须等到回调完成后才可以通过仅在该回调中使用它来实现。

Firestore.instance.collection('userdata').document('sepDGexTRuRkpx1WQYylDDmUI573')
.get().then((DocumentSnapshot ds){
    photoy=ds.data['photourl'];      

    setState(() {
        photourldisplay=photoy;
    });   
});

答案 1 :(得分:2)

您的代码很好,您只需要等待结果即可:

void yourVoid () async {
    String photoy;
    await Firestore.instance.collection('userdata').document('sepDGexTRuRkpx1WQYylDDmUI573')
        .get().then((DocumentSnapshot ds){
      photoy=ds.data['photourl'];
    });

    setState(() {
      photourldisplay=photoy;
    });
  }

编辑: 正如@道格·史蒂文森(Doug Stevenson)所说,有两种适当的解决方案:

void yourVoid () async {


    DocumentSnapshot ds = await Firestore.instance.collection('userdata').document('sepDGexTRuRkpx1WQYylDDmUI573')
        .get();

    String photoy = ds.data['photourl'];

    setState(() {
      photourldisplay=photoy;
    });
  }

和:

Firestore.instance.collection('userdata').document('sepDGexTRuRkpx1WQYylDDmUI573')
.get().then((DocumentSnapshot ds){
    photoy=ds.data['photourl'];      

    setState(() {
        photourldisplay=photoy;
    });   
});