在 Flutter 中从 Firestore 查询单个文档(cloud_firestore 插件)

Query a single document from Firestore in Flutter (cloud_firestore Plugin)

编辑:这个问题已经过时了,我相信,新的文档和更新的答案现在已经可用。

我只想通过其 ID 检索 单个文档 的数据。我对以下示例数据的处理方法:

TESTID1 {
     'name': 'example', 
     'data': 'sample data',
}

是这样的:

Firestore.instance.document('TESTID1').get() => then(function(document) {
    print(document('name'));
}

但这似乎不是正确的语法。

我无法找到任何关于在 flutter (dart) 中查询 firestore 的详细文档,因为 firebase 文档仅针对 Native WEB,iOS,Android 等,但不是 Flutter。 cloud_firestore 的文档也太短了。只有一个示例显示了如何将多个文档查询到一个流中,这不是我想要做的。

有关缺少文档的相关问题: https://github.com/flutter/flutter/issues/14324

从单个文档中获取数据并不难。

更新:

Firestore.instance.collection('COLLECTION').document('ID')
.get().then((DocumentSnapshot) =>
      print(DocumentSnapshot.data['key'].toString());
);

没有执行。

but that does not seem to be correct syntax.

语法不正确,因为您缺少 collection() 调用。您不能直接在 Firestore.instance 上调用 document()。要解决这个问题,你应该使用这样的东西:

var document = await Firestore.instance.collection('COLLECTION_NAME').document('TESTID1');
document.get() => then(function(document) {
    print(document("name"));
});

或者更简单的方式:

var document = await Firestore.instance.document('COLLECTION_NAME/TESTID1');
document.get() => then(function(document) {
    print(document("name"));
});

如果要实时获取数据,请使用以下代码:

Widget build(BuildContext context) {
  return new StreamBuilder(
      stream: Firestore.instance.collection('COLLECTION_NAME').document('TESTID1').snapshots(),
      builder: (context, snapshot) {
        if (!snapshot.hasData) {
          return new Text("Loading");
        }
        var userDocument = snapshot.data;
        return new Text(userDocument["name"]);
      }
  );
}

它还会帮助您将名称设置为文本视图。

如果您想使用 where 子句

await Firestore.instance.collection('collection_name').where(
    FieldPath.documentId,
    isEqualTo: "some_id"
).getDocuments().then((event) {
    if (event.documents.isNotEmpty) {
        Map<String, dynamic> documentData = event.documents.single.data; //if it is a single document
    }
}).catchError((e) => print("error fetching data: $e"));

这很简单,您可以使用 DOCUMENT SNAPSHOT

DocumentSnapshot variable = await Firestore.instance.collection('COLLECTION NAME').document('DOCUMENT ID').get();

您可以使用 variable.data['FEILD_NAME']

访问其数据

更新 FirebaseFirestore 12/2021

StreamBuilder(
          stream: FirebaseFirestore.instance
              .collection('YOUR COLLECTION NAME')
              .doc(id) //ID OF DOCUMENT
              .snapshots(),
        builder: (context, snapshot) {
        if (!snapshot.hasData) {
          return new CircularProgressIndicator();
        }
        var document = snapshot.data;
        return new Text(document["name"]);
     }
  );
}

这就是 2021 年对我有用的东西

      var userPhotos;
      Future<void> getPhoto(id) async {
        //query the user photo
        await FirebaseFirestore.instance.collection("users").doc(id).snapshots().listen((event) {
          setState(() {
            userPhotos = event.get("photoUrl");
            print(userPhotos);
          });
        });
      }

简单的方法:

StreamBuilder(
          stream: FirebaseFirestore.instance
              .collection('YOUR COLLECTION NAME')
              .doc(id) //ID OF DOCUMENT
              .snapshots(),
        builder: (context, snapshot) {
        if (!snapshot.hasData) {
          return new CircularProgressIndicator();
        }
        var document = snapshot.data;
        return new Text(document["name"]);
     }
  );
}

空安全代码(推荐)

您可以在函数中(例如按下按钮)或在小部件内(如 FutureBuilder)查询文档。

  • 方法中:(听一遍)

    var collection = FirebaseFirestore.instance.collection('users');
    var docSnapshot = await collection.doc('doc_id').get();
    if (docSnapshot.exists) {
      Map<String, dynamic>? data = docSnapshot.data();
      var value = data?['some_field']; // <-- The value you want to retrieve. 
      // Call setState if needed.
    }
    
  • 一首FutureBuilder(听一遍)

    FutureBuilder<DocumentSnapshot<Map<String, dynamic>>>(
      future: collection.doc('doc_id').get(),
      builder: (_, snapshot) {
        if (snapshot.hasError) return Text ('Error = ${snapshot.error}');
    
        if (snapshot.hasData) {
          var data = snapshot.data!.data();
          var value = data!['some_field']; // <-- Your value
          return Text('Value = $value');
        }
    
        return Center(child: CircularProgressIndicator());
      },
    )
    
  • StreamBuilder:(一直在听)

    StreamBuilder<DocumentSnapshot<Map<String, dynamic>>>(
      stream: collection.doc('doc_id').snapshots(),
      builder: (_, snapshot) {
        if (snapshot.hasError) return Text('Error = ${snapshot.error}');
    
        if (snapshot.hasData) {
          var output = snapshot.data!.data();
          var value = output!['some_field']; // <-- Your value
          return Text('Value = $value');
        }
    
        return Center(child: CircularProgressIndicator());
      },
    )
    

使用这个简单的代码:

Firestore.instance.collection("users").document().setData({
   "name":"Majeed Ahmed"
});

当您只想从 firestore 集合中获取文档,对其执行一些操作,而不是使用某些小部件显示它时,请使用此代码(2022 年 1 月更新)

   fetchDoc() async {

   // enter here the path , from where you want to fetch the doc
   DocumentSnapshot pathData = await FirebaseFirestore.instance
       .collection('ProfileData')
       .doc(currentUser.uid)
       .get();

   if (pathData.exists) {
     Map<String, dynamic>? fetchDoc = pathData.data() as Map<String, dynamic>?;
     
     //Now use fetchDoc?['KEY_names'], to access the data from firestore, to perform operations , for eg
     controllerName.text = fetchDoc?['userName']


     // setState(() {});  // use only if needed
   }
}
        var  document = await FirebaseFirestore.instance.collection('Users').doc('CXvGTxT49NUoKi9gRt96ltvljz42').get();
        Map<String,dynamic>? value = document.data();
        print(value!['userId']);