[英]Flutter Firestore - How to get data from a Document Reference in a Document Field?
[英]How to get data from firestore document fields in flutter?
我正在尝试在我的 flutter-app 中测试 firestore,但我无法真正按预期加载数据。
这就是我获取数据的方式:
Firestore.instance
.collection('Test')
.document('test')
.get()
.then((DocumentSnapshot ds) {
// use ds as a snapshot
print('Values from db: $ds');
});
和打印语句 output:flutter:来自 db 的值:“DocumentSnapshot”的实例。
我也试过以下,但没有成功:
Firestore.instance.collection('Test').document('test').get().then((data) {
// use ds as a snapshot
if (data.documentID.length > 0) {
setState(() {
stackOver = data.documentID;
print(stackOver);
});
}
});
Output 这里只是 documentID-name..
那么,我怎样才能从 firestore 中获取字段值呢?
最好的祝福!
尝试这个:
final String _collection = 'collectionName';
final Firestore _fireStore = Firestore.instance;
getData() async {
return await _fireStore.collection(_collection).getDocuments();
}
getData().then((val){
if(val.documents.length > 0){
print(val.documents[0].data["field"]);
}
else{
print("Not Found");
}
});
我遇到了类似的问题并以这种方式解决了它:
Stream<DocumentSnapshot> provideDocumentFieldStream() {
return Firestore.instance
.collection('collection')
.document('document')
.snapshots();
}
之后,我使用 StreamBuilder 来使用上面创建的方法:
StreamBuilder<DocumentSnapshot>(
stream: provideDocumentFieldStream(),
builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
if (snapshot.hasData) {
//snapshot -> AsyncSnapshot of DocumentSnapshot
//snapshot.data -> DocumentSnapshot
//snapshot.data.data -> Map of fields that you need :)
Map<String, dynamic> documentFields = snapshot.data.data;
//TODO Okay, now you can use documentFields (json) as needed
return Text(documentFields['field_that_i_need']);
}
}
)
我正在尝试在flutter-app中测试firestore,但是我无法真正按预期加载数据。
这就是我获取数据的方式:
Firestore.instance
.collection('Test')
.document('test')
.get()
.then((DocumentSnapshot ds) {
// use ds as a snapshot
print('Values from db: $ds');
});
以及打印语句输出:flutter:来自db的值:'DocumentSnapshot'的实例。
我还尝试了以下操作,但没有成功:
Firestore.instance.collection('Test').document('test').get().then((data) {
// use ds as a snapshot
if (data.documentID.length > 0) {
setState(() {
stackOver = data.documentID;
print(stackOver);
});
}
});
这里的输出仅是documentID名称。
那么,如何从Firestore获取字段值?
此致!
一次读取数据:
var collection = FirebaseFirestore.instance.collection('Test'); var docSnapshot = await collection.doc('test').get(); if (docSnapshot.exists) { Map<String, dynamic>? data = docSnapshot.data(); // You can then retrieve the value from the Map like this: var value = data?['your_field']; }
持续监听数据:
var collection = FirebaseFirestore.instance.collection('Test'); collection.doc('test').snapshots().listen((docSnapshot) { Map<String, dynamic>? data = docSnapshot.data(); if (docSnapshot.exists) { Map<String, dynamic>? data = docSnapshot.data(); // You can then retrieve the value from the Map like this: var value = data?['your_field']; } });
我在 Firestore 数据库中有一个用户列表,我需要提取用户名信息
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
FirebaseAuth firebaseAuth = FirebaseAuth.instance;
class Database {
static String? userName;
static void showDisplayName() async {
var collection = FirebaseFirestore.instance.collection('users');
//userUid is the current auth user
var docSnapshot = await collection.doc(userUid).get();
Map<String, dynamic> data = docSnapshot.data()!;
userName = data['displayName'];
}
}
然后你可以调用Database.userName
来获取字符串值
当你想不断地监听变化,并希望数据在没有热重载/重启的情况下得到更新
当你只想获取文档一次,而不需要一直监听文档的变化时。
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: StreamBuilder<QuerySnapshot>(
stream: FirebaseFirestore
.instance.
.collection('users') // 👈 Your desired collection name here
.snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasError) {
return const Text('Something went wrong');
}
if (snapshot.connectionState == ConnectionState.waiting) {
return const Text("Loading");
}
return ListView(
children: snapshot.data!.docs.map((DocumentSnapshot document) {
Map<String, dynamic> data =
document.data()! as Map<String, dynamic>;
return ListTile(
title: Text(data['fullName']), // 👈 Your valid data here
);
}).toList());
},
),
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: StreamBuilder<DocumentSnapshot<Map<String, dynamic>>>(
stream: FirebaseFirestore
.instance
.collection('users')
.doc(FirebaseAuth.instance.currentUser!.uid) // 👈 Your document id change accordingly
.snapshots(),
builder:
(BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
if (snapshot.hasError) {
return const Text('Something went wrong');
}
if (snapshot.connectionState == ConnectionState.waiting) {
return const Text("Loading");
}
Map<String, dynamic> data =
snapshot.data!.data()! as Map<String, dynamic>;
return Text(data['fullName']); // 👈 your valid data here
},
),
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: FutureBuilder<QuerySnapshot>(
future: FirebaseFirestore
.instance
.collection('users') // 👈 Your collection name here
.get(),
builder: (_, snapshot) {
if (snapshot.hasError) return Text('Error = ${snapshot.error}');
if (snapshot.connectionState == ConnectionState.waiting) {
return const Text("Loading");
}
return ListView(
children: snapshot.data!.docs.map((DocumentSnapshot document) {
Map<String, dynamic> data = document.data()! as Map<String, dynamic>;
return ListTile(
title: Text(data['avatar']), // 👈 Your valid data here
);
}).toList());
},
)),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: FutureBuilder<DocumentSnapshot<Map<String, dynamic>>>(
future: FirebaseFirestore.instance
.collection('users')
.doc(FirebaseAuth.instance.currentUser!.uid) // 👈 Your document id change accordingly
.get(),
builder: (_, snapshot) {
if (snapshot.hasError) return Text('Error = ${snapshot.error}');
if (snapshot.connectionState == ConnectionState.waiting) {
return const Text("Loading");
}
Map<String, dynamic> data = snapshot.data!.data()!;
return Text(data['fullName']); //👈 Your valid data here
},
)),
);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.