我只想通过其ID检索单个文档的数据。我的示例数据为:
TESTID1 {
'name': 'example',
'data': 'sample data',
}
是这样的:
Firestore.instance.document('TESTID1').get() => then(function(document) {
print(document('name'));
}
但这似乎不是正确的语法。
我无法在Flutter(飞镖)中找到关于查询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());
);
未执行。
答案 0 :(得分:15)
如果要使用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"));
答案 1 :(得分:8)
但这似乎不是正确的语法。
这是不正确的语法,因为您缺少collection()
调用。您无法直接在document()
上致电Firestore.instance
。为了解决这个问题,您应该使用类似以下的方法:
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"]);
}
);
}
这还将帮助您将名称设置为文本视图。
答案 2 :(得分:6)
更新 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"]);
}
);
}
答案 3 :(得分:3)
这很简单,您可以使用文档快照
DocumentSnapshot variable = await Firestore.instance.collection('COLLECTION NAME').document('DOCUMENT ID').get();
您可以使用variable.data['FEILD_NAME']
答案 4 :(得分:3)
这就是 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);
});
});
}
答案 5 :(得分:1)
您可以在函数(例如按下按钮时)或小部件(例如 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());
},
)