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

问题描述 投票:0回答:11

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

我只想通过 ID 检索“单个文档”的数据。我的方法示例数据为: TESTID1 { 'name': 'example', 'data': 'sample data', }

是这样的:

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

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

我无法在 flutter (dart) 中找到

有关查询 firestore 的任何详细文档

,因为 firebase 文档仅涉及本机 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()); );

未执行。

firebase dart flutter google-cloud-firestore querying
11个回答
89
投票
但这似乎不是正确的语法。

这不是正确的语法,因为您缺少
collection()

调用。要解决这个问题,你应该使用这样的东西:

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"]); } ); }

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


39
投票

您可以在函数中(例如按下按钮)或在小部件(如

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()); }, )

    
        

26
投票

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"));



12
投票

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

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

 访问其数据
    


6
投票

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"]); } ); }



3
投票

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); }); }); }



2
投票

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 } }



1
投票
简单的方法:

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"]); } ); }



1
投票


1
投票

future FirebaseDocument() async{ var variable = await FirebaseFirestore.instance.collection('Collection_name').doc('Document_Id').get(); print(variable['field_name']); }



-3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.