คุณสามารถ ฟัง เอกสารด้วยเมธอด onSnapshot()
การโทรครั้งแรกโดยใช้การโทรกลับที่คุณระบุจะสร้างภาพรวมของเอกสารทันทีพร้อมเนื้อหาปัจจุบันของเอกสารเดียว จากนั้น ทุกครั้งที่เนื้อหาเปลี่ยนแปลง การโทรอีกครั้งจะอัปเดตภาพรวมของเอกสาร
Web modular API
import { doc, onSnapshot } from "firebase/firestore"; const unsub = onSnapshot(doc(db, "cities", "SF"), (doc) => { console.log("Current data: ", doc.data()); });
Web namespaced API
db.collection("cities").doc("SF") .onSnapshot((doc) => { console.log("Current data: ", doc.data()); });
สวิฟต์
db.collection("cities").document("SF") .addSnapshotListener { documentSnapshot, error in guard let document = documentSnapshot else { print("Error fetching document: \(error!)") return } guard let data = document.data() else { print("Document data was empty.") return } print("Current data: \(data)") }
วัตถุประสงค์-C
[[[self.db collectionWithPath:@"cities"] documentWithPath:@"SF"] addSnapshotListener:^(FIRDocumentSnapshot *snapshot, NSError *error) { if (snapshot == nil) { NSLog(@"Error fetching document: %@", error); return; } NSLog(@"Current data: %@", snapshot.data); }];
Kotlin+KTX
val docRef = db.collection("cities").document("SF") docRef.addSnapshotListener { snapshot, e -> if (e != null) { Log.w(TAG, "Listen failed.", e) return@addSnapshotListener } if (snapshot != null && snapshot.exists()) { Log.d(TAG, "Current data: ${snapshot.data}") } else { Log.d(TAG, "Current data: null") } }
Java
final DocumentReference docRef = db.collection("cities").document("SF"); docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() { @Override public void onEvent(@Nullable DocumentSnapshot snapshot, @Nullable FirebaseFirestoreException e) { if (e != null) { Log.w(TAG, "Listen failed.", e); return; } if (snapshot != null && snapshot.exists()) { Log.d(TAG, "Current data: " + snapshot.getData()); } else { Log.d(TAG, "Current data: null"); } } });
Dart
final docRef = db.collection("cities").doc("SF"); docRef.snapshots().listen( (event) => print("current data: ${event.data()}"), onError: (error) => print("Listen failed: $error"), );
บ่อยครั้งที่คุณต้องการให้ UI ของคุณตอบสนองต่อการเปลี่ยนแปลงในเนื้อหาของเอกสารหรือคอลเลกชัน Firestore คุณสามารถทำได้ด้วยวิดเจ็ต StreamBuilder
ที่ใช้สตรีมสแน็ปช็อตของ Firestore:
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 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['full_name']), subtitle: Text(data['company']), ); }) .toList() .cast(), ); }, ); } }
ชวา
หลาม
ภาษาซี++
DocumentReference doc_ref = db->Collection("cities").Document("SF"); doc_ref.AddSnapshotListener( [](const DocumentSnapshot& snapshot, Error error, const std::string& errorMsg) { if (error == Error::kErrorOk) { if (snapshot.exists()) { std::cout << "Current data: " << snapshot << std::endl; } else { std::cout << "Current data: null" << std::endl; } } else { std::cout << "Listen failed: " << error << std::endl; } });
โหนด js
ไป
พี.เอช.พี
// Not supported in the PHP client library
ความสามัคคี
DocumentReference docRef = db.Collection("cities").Document("SF"); docRef.Listen(snapshot => { Debug.Log("Callback received document snapshot."); Debug.Log(String.Format("Document data for {0} document:", snapshot.Id)); Dictionary<string, object> city = snapshot.ToDictionary(); foreach (KeyValuePair<string, object> pair in city) { Debug.Log(String.Format("{0}: {1}", pair.Key, pair.Value)); } });
ค#
ทับทิม
เหตุการณ์สำหรับการเปลี่ยนแปลงในท้องถิ่น
การเขียนในเครื่องในแอปของคุณจะเรียกใช้สแนปช็อตฟังทันที นี่เป็นเพราะคุณลักษณะสำคัญที่เรียกว่า "การชดเชยเวลาแฝง" เมื่อคุณดำเนินการเขียน ผู้ฟังของคุณจะได้รับแจ้งด้วยข้อมูลใหม่ ก่อนที่ ข้อมูลจะถูกส่งไปยังแบ็กเอนด์
เอกสารที่ดึงมามีคุณสมบัติ metadata.hasPendingWrites
ที่ระบุว่าเอกสารมีการเปลี่ยนแปลงในเครื่องที่ยังไม่ได้เขียนไปยังแบ็กเอนด์หรือไม่ คุณสามารถใช้คุณสมบัตินี้เพื่อกำหนดแหล่งที่มาของเหตุการณ์ที่ได้รับจากสแนปช็อตฟังของคุณ:
Web modular API
import { doc, onSnapshot } from "firebase/firestore"; const unsub = onSnapshot(doc(db, "cities", "SF"), (doc) => { const source = doc.metadata.hasPendingWrites ? "Local" : "Server"; console.log(source, " data: ", doc.data()); });
Web namespaced API
db.collection("cities").doc("SF") .onSnapshot((doc) => { var source = doc.metadata.hasPendingWrites ? "Local" : "Server"; console.log(source, " data: ", doc.data()); });
สวิฟต์
db.collection("cities").document("SF") .addSnapshotListener { documentSnapshot, error in guard let document = documentSnapshot else { print("Error fetching document: \(error!)") return } let source = document.metadata.hasPendingWrites ? "Local" : "Server" print("\(source) data: \(document.data() ?? [:])") }
วัตถุประสงค์-C
[[[self.db collectionWithPath:@"cities"] documentWithPath:@"SF"] addSnapshotListener:^(FIRDocumentSnapshot *snapshot, NSError *error) { if (snapshot == nil) { NSLog(@"Error fetching document: %@", error); return; } NSString *source = snapshot.metadata.hasPendingWrites ? @"Local" : @"Server"; NSLog(@"%@ data: %@", source, snapshot.data); }];
Kotlin+KTX
val docRef = db.collection("cities").document("SF") docRef.addSnapshotListener { snapshot, e -> if (e != null) { Log.w(TAG, "Listen failed.", e) return@addSnapshotListener } val source = if (snapshot != null && snapshot.metadata.hasPendingWrites()) { "Local" } else { "Server" } if (snapshot != null && snapshot.exists()) { Log.d(TAG, "$source data: ${snapshot.data}") } else { Log.d(TAG, "$source data: null") } }
Java
final DocumentReference docRef = db.collection("cities").document("SF"); docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() { @Override public void onEvent(@Nullable DocumentSnapshot snapshot, @Nullable FirebaseFirestoreException e) { if (e != null) { Log.w(TAG, "Listen failed.", e); return; } String source = snapshot != null && snapshot.getMetadata().hasPendingWrites() ? "Local" : "Server"; if (snapshot != null && snapshot.exists()) { Log.d(TAG, source + " data: " + snapshot.getData()); } else { Log.d(TAG, source + " data: null"); } } });
Dart
final docRef = db.collection("cities").doc("SF"); docRef.snapshots().listen( (event) { final source = (event.metadata.hasPendingWrites) ? "Local" : "Server"; print("$source data: ${event.data()}"); }, onError: (error) => print("Listen failed: $error"), );
ชวา
# Not yet supported in the Java client library
หลาม
// Not yet supported in Python client library
ภาษาซี++
DocumentReference doc_ref = db->Collection("cities").Document("SF"); doc_ref.AddSnapshotListener([](const DocumentSnapshot& snapshot, Error error, const std::string& errorMsg) { if (error == Error::kErrorOk) { const char* source = snapshot.metadata().has_pending_writes() ? "Local" : "Server"; if (snapshot.exists()) { std::cout << source << " data: " << snapshot.Get("name").string_value() << std::endl; } else { std::cout << source << " data: null" << std::endl; } } else { std::cout << "Listen failed: " << error << std::endl; } });
โหนด js
// Not yet supported in the Node.js client library
ไป
// Not yet supported in the Go client library
พี.เอช.พี
// Not supported in the PHP client library
ความสามัคคี
// Not yet supported in the Unity SDK
ค#
// Not yet supported in the C# client library
ทับทิม
// Not yet supported in the Ruby client library
เหตุการณ์สำหรับการเปลี่ยนแปลงข้อมูลเมตา
เมื่อรับฟังการเปลี่ยนแปลงในเอกสาร คอลเลกชัน หรือแบบสอบถาม คุณสามารถส่งตัวเลือกเพื่อควบคุมความละเอียดของเหตุการณ์ที่ผู้ฟังของคุณจะได้รับ
ตามค่าเริ่มต้น ผู้ฟังจะไม่ได้รับแจ้งเกี่ยวกับการเปลี่ยนแปลงที่ส่งผลต่อข้อมูลเมตาเท่านั้น พิจารณาว่าจะเกิดอะไรขึ้นเมื่อแอปของคุณเขียนเอกสารใหม่:
- เหตุการณ์การเปลี่ยนแปลงจะเริ่มทำงานทันทีพร้อมกับข้อมูลใหม่ เอกสารยังไม่ได้ถูกเขียนไปยังแบ็กเอนด์ ดังนั้นแฟล็ก "รอการเขียน" จึงเป็น
true
- เอกสารถูกเขียนไปที่แบ็กเอนด์
- แบ็กเอนด์แจ้งไคลเอ็นต์ถึงการเขียนที่สำเร็จ ไม่มีการเปลี่ยนแปลงข้อมูลเอกสาร แต่มีการเปลี่ยนแปลงข้อมูลเมตาเนื่องจากแฟล็ก "รอการเขียน" เป็น
false
หากคุณต้องการรับเหตุการณ์สแน็ปช็อตเมื่อข้อมูลเมตาของเอกสารหรือแบบสอบถามเปลี่ยนแปลง ให้ส่งวัตถุตัวเลือกการฟังเมื่อแนบฟังของคุณ:
Web modular API
import { doc, onSnapshot } from "firebase/firestore"; const unsub = onSnapshot( doc(db, "cities", "SF"), { includeMetadataChanges: true }, (doc) => { // ... });
Web namespaced API
db.collection("cities").doc("SF") .onSnapshot({ // Listen for document metadata changes includeMetadataChanges: true }, (doc) => { // ... });
สวิฟต์
// Listen to document metadata. db.collection("cities").document("SF") .addSnapshotListener(includeMetadataChanges: true) { documentSnapshot, error in // ... }
วัตถุประสงค์-C
// Listen for metadata changes. [[[self.db collectionWithPath:@"cities"] documentWithPath:@"SF"] addSnapshotListenerWithIncludeMetadataChanges:YES listener:^(FIRDocumentSnapshot *snapshot, NSError *error) { // ... }];
Kotlin+KTX
// Listen for metadata changes to the document. val docRef = db.collection("cities").document("SF") docRef.addSnapshotListener(MetadataChanges.INCLUDE) { snapshot, e -> // ... }
Java
// Listen for metadata changes to the document. DocumentReference docRef = db.collection("cities").document("SF"); docRef.addSnapshotListener(MetadataChanges.INCLUDE, new EventListener<DocumentSnapshot>() { @Override public void onEvent(@Nullable DocumentSnapshot snapshot, @Nullable FirebaseFirestoreException e) { // ... } });
Dart
final docRef = db.collection("cities").doc("SF"); docRef.snapshots(includeMetadataChanges: true).listen((event) { // ... });
ชวา
// Not yet supported in the Java client library
หลาม
// Not yet supported in Python client library
ภาษาซี++
DocumentReference doc_ref = db->Collection("cities").Document("SF"); doc_ref.AddSnapshotListener( MetadataChanges::kInclude, [](const DocumentSnapshot& snapshot, Error error, const std::string& errorMsg) { /* ... */ });
โหนด js
// Not yet supported the Node.js client library
ไป
// Not yet supported in the Go client library
พี.เอช.พี
// Not supported in the PHP client library
ความสามัคคี
// Not yet supported in the Unity SDK
ค#
// Not yet supported in the C# client library
ทับทิม
// Not yet supported in the Ruby client library
ฟังเอกสารหลายชุดในคอลเลกชัน
เช่นเดียวกับเอกสาร คุณสามารถใช้ onSnapshot()
แทน get()
เพื่อฟังผลลัพธ์ของแบบสอบถาม สิ่งนี้จะสร้างสแนปชอตของแบบสอบถาม ตัวอย่างเช่น หากต้องการฟังเอกสารที่มีสถานะ CA
:
Web modular API
import { collection, query, where, onSnapshot } from "firebase/firestore"; const q = query(collection(db, "cities"), where("state", "==", "CA")); const unsubscribe = onSnapshot(q, (querySnapshot) => { const cities = []; querySnapshot.forEach((doc) => { cities.push(doc.data().name); }); console.log("Current cities in CA: ", cities.join(", ")); });
Web namespaced API
db.collection("cities").where("state", "==", "CA") .onSnapshot((querySnapshot) => { var cities = []; querySnapshot.forEach((doc) => { cities.push(doc.data().name); }); console.log("Current cities in CA: ", cities.join(", ")); });
สวิฟต์
db.collection("cities").whereField("state", isEqualTo: "CA") .addSnapshotListener { querySnapshot, error in guard let documents = querySnapshot?.documents else { print("Error fetching documents: \(error!)") return } let cities = documents.map { $0["name"]! } print("Current cities in CA: \(cities)") }
วัตถุประสงค์-C
[[[self.db collectionWithPath:@"cities"] queryWhereField:@"state" isEqualTo:@"CA"] addSnapshotListener:^(FIRQuerySnapshot *snapshot, NSError *error) { if (snapshot == nil) { NSLog(@"Error fetching documents: %@", error); return; } NSMutableArray *cities = [NSMutableArray array]; for (FIRDocumentSnapshot *document in snapshot.documents) { [cities addObject:document.data[@"name"]]; } NSLog(@"Current cities in CA: %@", cities); }];
Kotlin+KTX
db.collection("cities") .whereEqualTo("state", "CA") .addSnapshotListener { value, e -> if (e != null) { Log.w(TAG, "Listen failed.", e) return@addSnapshotListener } val cities = ArrayList<String>() for (doc in value!!) { doc.getString("name")?.let { cities.add(it) } } Log.d(TAG, "Current cites in CA: $cities") }
Java
db.collection("cities") .whereEqualTo("state", "CA") .addSnapshotListener(new EventListener<QuerySnapshot>() { @Override public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException e) { if (e != null) { Log.w(TAG, "Listen failed.", e); return; } List<String> cities = new ArrayList<>(); for (QueryDocumentSnapshot doc : value) { if (doc.get("name") != null) { cities.add(doc.getString("name")); } } Log.d(TAG, "Current cites in CA: " + cities); } });
Dart
db .collection("cities") .where("state", isEqualTo: "CA") .snapshots() .listen((event) { final cities = []; for (var doc in event.docs) { cities.add(doc.data()["name"]); } print("cities in CA: ${cities.join(", ")}"); });
ชวา
หลาม
ภาษาซี++
db->Collection("cities") .WhereEqualTo("state", FieldValue::String("CA")) .AddSnapshotListener([](const QuerySnapshot& snapshot, Error error, const std::string& errorMsg) { if (error == Error::kErrorOk) { std::vector<std::string> cities; std::cout << "Current cities in CA: " << error << std::endl; for (const DocumentSnapshot& doc : snapshot.documents()) { cities.push_back(doc.Get("name").string_value()); std::cout << "" << cities.back() << std::endl; } } else { std::cout << "Listen failed: " << error << std::endl; } });
โหนด js
ไป
พี.เอช.พี
// Not supported in the PHP client library
ความสามัคคี
Query query = db.Collection("cities").WhereEqualTo("State", "CA"); ListenerRegistration listener = query.Listen(snapshot => { Debug.Log("Callback received query snapshot."); Debug.Log("Current cities in California:"); foreach (DocumentSnapshot documentSnapshot in snapshot.Documents) { Debug.Log(documentSnapshot.Id); } });
ค#
ทับทิม
ตัวจัดการสแน็ปช็อตจะได้รับสแน็ปช็อตของแบบสอบถามใหม่ทุกครั้งที่ผลลัพธ์ของแบบสอบถามเปลี่ยนแปลง (นั่นคือ เมื่อมีการเพิ่ม นำออก หรือแก้ไขเอกสาร)
ดูการเปลี่ยนแปลงระหว่างภาพรวม
การดูการเปลี่ยนแปลงที่เกิดขึ้นจริงกับผลลัพธ์ของคิวรีระหว่างสแนปชอตของคิวรีมักจะเป็นประโยชน์ แทนที่จะใช้สแน็ปช็อตของคิวรีทั้งหมด ตัวอย่างเช่น คุณอาจต้องการรักษาแคชเมื่อเอกสารแต่ละรายการถูกเพิ่ม ลบ และแก้ไข
Web modular API
import { collection, query, where, onSnapshot } from "firebase/firestore"; const q = query(collection(db, "cities"), where("state", "==", "CA")); const unsubscribe = onSnapshot(q, (snapshot) => { snapshot.docChanges().forEach((change) => { if (change.type === "added") { console.log("New city: ", change.doc.data()); } if (change.type === "modified") { console.log("Modified city: ", change.doc.data()); } if (change.type === "removed") { console.log("Removed city: ", change.doc.data()); } }); });
Web namespaced API
db.collection("cities").where("state", "==", "CA") .onSnapshot((snapshot) => { snapshot.docChanges().forEach((change) => { if (change.type === "added") { console.log("New city: ", change.doc.data()); } if (change.type === "modified") { console.log("Modified city: ", change.doc.data()); } if (change.type === "removed") { console.log("Removed city: ", change.doc.data()); } }); });
สวิฟต์
db.collection("cities").whereField("state", isEqualTo: "CA") .addSnapshotListener { querySnapshot, error in guard let snapshot = querySnapshot else { print("Error fetching snapshots: \(error!)") return } snapshot.documentChanges.forEach { diff in if (diff.type == .added) { print("New city: \(diff.document.data())") } if (diff.type == .modified) { print("Modified city: \(diff.document.data())") } if (diff.type == .removed) { print("Removed city: \(diff.document.data())") } } }
วัตถุประสงค์-C
[[[self.db collectionWithPath:@"cities"] queryWhereField:@"state" isEqualTo:@"CA"] addSnapshotListener:^(FIRQuerySnapshot *snapshot, NSError *error) { if (snapshot == nil) { NSLog(@"Error fetching documents: %@", error); return; } for (FIRDocumentChange *diff in snapshot.documentChanges) { if (diff.type == FIRDocumentChangeTypeAdded) { NSLog(@"New city: %@", diff.document.data); } if (diff.type == FIRDocumentChangeTypeModified) { NSLog(@"Modified city: %@", diff.document.data); } if (diff.type == FIRDocumentChangeTypeRemoved) { NSLog(@"Removed city: %@", diff.document.data); } } }];
Kotlin+KTX
db.collection("cities") .whereEqualTo("state", "CA") .addSnapshotListener { snapshots, e -> if (e != null) { Log.w(TAG, "listen:error", e) return@addSnapshotListener } for (dc in snapshots!!.documentChanges) { when (dc.type) { DocumentChange.Type.ADDED -> Log.d(TAG, "New city: ${dc.document.data}") DocumentChange.Type.MODIFIED -> Log.d(TAG, "Modified city: ${dc.document.data}") DocumentChange.Type.REMOVED -> Log.d(TAG, "Removed city: ${dc.document.data}") } } }
Java
db.collection("cities") .whereEqualTo("state", "CA") .addSnapshotListener(new EventListener<QuerySnapshot>() { @Override public void onEvent(@Nullable QuerySnapshot snapshots, @Nullable FirebaseFirestoreException e) { if (e != null) { Log.w(TAG, "listen:error", e); return; } for (DocumentChange dc : snapshots.getDocumentChanges()) { switch (dc.getType()) { case ADDED: Log.d(TAG, "New city: " + dc.getDocument().getData()); break; case MODIFIED: Log.d(TAG, "Modified city: " + dc.getDocument().getData()); break; case REMOVED: Log.d(TAG, "Removed city: " + dc.getDocument().getData()); break; } } } });
Dart
db .collection("cities") .where("state", isEqualTo: "CA") .snapshots() .listen((event) { for (var change in event.docChanges) { switch (change.type) { case DocumentChangeType.added: print("New City: ${change.doc.data()}"); break; case DocumentChangeType.modified: print("Modified City: ${change.doc.data()}"); break; case DocumentChangeType.removed: print("Removed City: ${change.doc.data()}"); break; } } });
ชวา
ภาษาซี++
db->Collection("cities") .WhereEqualTo("state", FieldValue::String("CA")) .AddSnapshotListener([](const QuerySnapshot& snapshot, Error error, const std::string& errorMsg) { if (error == Error::kErrorOk) { for (const DocumentChange& dc : snapshot.DocumentChanges()) { switch (dc.type()) { case DocumentChange::Type::kAdded: std::cout << "New city: " << dc.document().Get("name").string_value() << std::endl; break; case DocumentChange::Type::kModified: std::cout << "Modified city: " << dc.document().Get("name").string_value() << std::endl; break; case DocumentChange::Type::kRemoved: std::cout << "Removed city: " << dc.document().Get("name").string_value() << std::endl; break; } } } else { std::cout << "Listen failed: " << error << std::endl; } });
หลาม
โหนด js
ไป
พี.เอช.พี
// Not supported in the PHP client library
ความสามัคคี
Query query = db.Collection("cities").WhereEqualTo("State", "CA"); ListenerRegistration listener = query.Listen(snapshot => { foreach (DocumentChange change in snapshot.GetChanges()) { if (change.ChangeType == DocumentChange.Type.Added) { Debug.Log(String.Format("New city: {0}", change.Document.Id)); } else if (change.ChangeType == DocumentChange.Type.Modified) { Debug.Log(String.Format("Modified city: {0}", change.Document.Id)); } else if (change.ChangeType == DocumentChange.Type.Removed) { Debug.Log(String.Format("Removed city: {0}", change.Document.Id)); } } }); } }
ค#
ทับทิม
สถานะเริ่มต้นอาจมาจากเซิร์ฟเวอร์โดยตรง หรือจากแคชภายในเครื่อง หากมีสถานะพร้อมใช้งานในแคชในเครื่อง สแน็ปช็อตการสืบค้นจะถูกเติมด้วยข้อมูลที่แคชในขั้นต้น จากนั้นจึงอัปเดตด้วยข้อมูลของเซิร์ฟเวอร์เมื่อไคลเอนต์ตรวจพบสถานะของเซิร์ฟเวอร์
แยกผู้ฟัง
เมื่อคุณไม่สนใจที่จะฟังข้อมูลของคุณอีกต่อไป คุณต้องแยกตัวฟังออกเพื่อให้การเรียกกลับเหตุการณ์ของคุณหยุดการเรียก สิ่งนี้ทำให้ไคลเอ็นต์หยุดใช้แบนด์วิธเพื่อรับการอัปเดต ตัวอย่างเช่น:
Web modular API
import { collection, onSnapshot } from "firebase/firestore"; const unsubscribe = onSnapshot(collection(db, "cities"), () => { // Respond to data // ... }); // Later ... // Stop listening to changes unsubscribe();
Web namespaced API
var unsubscribe = db.collection("cities") .onSnapshot(() => { // Respond to data // ... }); // Later ... // Stop listening to changes unsubscribe();
สวิฟต์
let listener = db.collection("cities").addSnapshotListener { querySnapshot, error in // ... } // ... // Stop listening to changes listener.remove()
วัตถุประสงค์-C
id<FIRListenerRegistration> listener = [[self.db collectionWithPath:@"cities"] addSnapshotListener:^(FIRQuerySnapshot *snapshot, NSError *error) { // ... }]; // ... // Stop listening to changes [listener remove];
Kotlin+KTX
val query = db.collection("cities") val registration = query.addSnapshotListener { snapshots, e -> // ... } // ... // Stop listening to changes registration.remove()
Java
Query query = db.collection("cities"); ListenerRegistration registration = query.addSnapshotListener( new EventListener<QuerySnapshot>() { // ... }); // ... // Stop listening to changes registration.remove();
Dart
final collection = db.collection("cities"); final listener = collection.snapshots().listen((event) { // ... }); listener.cancel();
ชวา
หลาม
ภาษาซี++
// Add a listener Query query = db->Collection("cities"); ListenerRegistration registration = query.AddSnapshotListener( [](const QuerySnapshot& snapshot, Error error, const std::string& errorMsg) { /* ... */ }); // Stop listening to changes registration.Remove();
โหนด js
ไป
พี.เอช.พี
// Not supported in the PHP client library
ความสามัคคี
listener.Stop();
ค#
ทับทิม
จัดการกับข้อผิดพลาดในการฟัง
การฟังอาจล้มเหลวในบางครั้ง เช่น เนื่องจากสิทธิ์ด้านความปลอดภัย หรือหากคุณพยายามฟังโดยใช้คำค้นหาที่ไม่ถูกต้อง (เรียนรู้เพิ่มเติมเกี่ยวกับ ข้อความค้นหาที่ถูกต้องและไม่ถูกต้อง ) เพื่อจัดการกับความล้มเหลวเหล่านี้ คุณสามารถจัดเตรียมการเรียกกลับข้อผิดพลาดเมื่อคุณแนบสแน็ปช็อตฟังของคุณ หลังจากเกิดข้อผิดพลาด ผู้ฟังจะไม่ได้รับเหตุการณ์ใดๆ อีกต่อไป และไม่จำเป็นต้องแยกผู้ฟังของคุณออก
Web modular API
import { collection, onSnapshot } from "firebase/firestore"; const unsubscribe = onSnapshot( collection(db, "cities"), (snapshot) => { // ... }, (error) => { // ... });
Web namespaced API
db.collection("cities") .onSnapshot((snapshot) => { // ... }, (error) => { // ... });
สวิฟต์
db.collection("cities") .addSnapshotListener { querySnapshot, error in if let error = error { print("Error retreiving collection: \(error)") } }
วัตถุประสงค์-C
[[self.db collectionWithPath:@"cities"] addSnapshotListener:^(FIRQuerySnapshot *snapshot, NSError *error) { if (error != nil) { NSLog(@"Error retreving collection: %@", error); } }];
Kotlin+KTX
db.collection("cities") .addSnapshotListener { snapshots, e -> if (e != null) { Log.w(TAG, "listen:error", e) return@addSnapshotListener } for (dc in snapshots!!.documentChanges) { if (dc.type == DocumentChange.Type.ADDED) { Log.d(TAG, "New city: ${dc.document.data}") } } }
Java
db.collection("cities") .addSnapshotListener(new EventListener<QuerySnapshot>() { @Override public void onEvent(@Nullable QuerySnapshot snapshots, @Nullable FirebaseFirestoreException e) { if (e != null) { Log.w(TAG, "listen:error", e); return; } for (DocumentChange dc : snapshots.getDocumentChanges()) { if (dc.getType() == Type.ADDED) { Log.d(TAG, "New city: " + dc.getDocument().getData()); } } } });
Dart
final docRef = db.collection("cities"); docRef.snapshots().listen( (event) => print("listener attached"), onError: (error) => print("Listen failed: $error"), );
ชวา
หลาม
// Snippet coming soon
ภาษาซี++
// Snippet coming soon.
โหนด js
ไป
พี.เอช.พี
// Not supported in the PHP client library
ความสามัคคี
// Not supported in the Unity SDK.
ค#
// Snippet coming soon
ทับทิม
อะไรต่อไป
- รวมผู้ฟังเข้ากับข้อความค้นหาแบบธรรมดาและแบบผสม
- สั่งและจำกัดการดึงเอกสาร
- ทำความเข้าใจการเรียกเก็บเงินสำหรับผู้ฟัง