在 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']);
编辑:这个问题已经过时了,我相信,新的文档和更新的答案现在已经可用。
我只想通过其 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']);