从 Cloud Firestore 读取数据
Cloud Firestore 让您能够读取集合或文档的值。这可以是一次性读取,也可以在查询中的数据发生更改时由实时更新提供。
一次性阅读
要读取一次集合或文档,请调用Query.get 或 DocumentReference.get 方法。在下面的示例中,FutureBuilder 用于帮助管理请求的状态:
class GetUserName extends StatelessWidget {
final String documentId;
GetUserName(this.documentId);
@override
Widget build(BuildContext context) {
CollectionReference users = FirebaseFirestore.instance.collection('users');
return FutureBuilder<DocumentSnapshot>(
future: users.doc(documentId).get(),
builder:
(BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
if (snapshot.hasError) {
return Text("Something went wrong");
}
if (snapshot.hasData && !snapshot.data.exists) {
return Text("Document does not exist");
}
if (snapshot.connectionState == ConnectionState.done) {
Map<String, dynamic> data = snapshot.data.data();
return Text("Full Name: ${data['full_name']} ${data['last_name']}");
}
return Text("loading");
},
);
}
}
要了解有关离线读取数据的更多信息,请查看 Access Data Offline 文档。
实时变化
FlutterFire 支持处理集合和文档的实时更改。在初始请求中提供一个新事件,并且在发生更改(修改、删除或添加)时对集合/文档进行任何后续更改。
CollectionReference 和 DocumentReference 都提供了一个返回 Stream 的 snapshots() 方法:
Stream collectionStream = FirebaseFirestore.instance.collection('users').snapshots();
Stream documentStream = FirebaseFirestore.instance.collection('users').doc('ABC123').snapshots();
返回后,您可以通过 listen() 方法订阅更新。下面的示例使用 StreamBuilder 来帮助自动管理流状态并在您的应用中不再使用流时对其进行处置:
class UserInformation extends StatefulWidget {
@override
_UserInformationState createState() => _UserInformationState();
}
class _UserInformationState extends State<UserInformation> {
final Stream<QuerySnapshot> _usersStream = FirebaseFirestore.instance.collection('users').snapshots();
@override
Widget build(BuildContext context) {
return StreamBuilder<QuerySnapshot>(
stream: _usersStream,
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasError) {
return Text('Something went wrong');
}
if (snapshot.connectionState == ConnectionState.waiting) {
return Text("Loading");
}
return new ListView(
children: snapshot.data.docs.map((DocumentSnapshot document) {
return new ListTile(
title: new Text(document.data()['full_name']),
subtitle: new Text(document.data()['company']),
);
}).toList(),
);
},
);
}
}
默认情况下,如果发生仅影响元数据的更改,侦听器不会更新。如果您想在文档或查询元数据发生更改时接收事件,可以将 includeMetadataChanges 传递给 snapshots 方法:
FirebaseFirestore.instance
.collection('users')
.snapshots(includeMetadataChanges: true)