Ich hätte gerne eine Listener-Methode, die nach Änderungen an einer Sammlung von Dokumenten sucht, wenn Änderungen auftreten.
Etwas wie:
import 'package:cloud_firestore/cloud_firestore.dart';
Future<Null> checkFocChanges() async {
Firestore.instance.runTransaction((Transaction tx) async {
CollectionReference reference = Firestore.instance.collection('planets');
reference.onSnapshot.listen((querySnapshot) {
querySnapshot.docChanges.forEach((change) {
// Do something with change
});
});
});
}
Der Fehler hier ist, dass onSnapshotnicht auf definiert ist CollectionReference.
Irgendwelche Ideen?
Lösung des Problems
Wenn Sie die cloud_firestoreDokumentation durchlesen, können Sie sehen, dass a Streamvon a Queryüber abgerufen werden kann snapshots().
Damit Sie es verstehen, werde ich Ihren Code nur ein kleines bisschen umwandeln:
CollectionReference reference = Firestore.instance.collection('planets');
reference.snapshots().listen((querySnapshot) {
querySnapshot.documentChanges.forEach((change) {
// Do something with change
});
});
Sie sollten dies auch nicht in einer Transaktion ausführen. Der Flutter-Weg, dies zu tun, verwendet eine StreamBuilder, direkt von der cloud_firestore Dart -Pub-Seite:
StreamBuilder<QuerySnapshot>(
stream: Firestore.instance.collection('books').snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (!snapshot.hasData) return new Text('Loading...');
return new ListView(
children: snapshot.data.documents.map((DocumentSnapshot document) {
return new ListTile(
title: new Text(document['title']),
subtitle: new Text(document['author']),
);
}).toList(),
);
},
);
Wenn du mehr wissen willst, kannst du dir die Quelle anschauen, es ist gut dokumentiert, wo es nicht selbsterklärend ist.
Beachten Sie auch, dass ich zu geändert docChangeshabe documentChanges. Das sieht man in der query_snapshotDatei. Wenn Sie eine IDE wie IntelliJ oder Android Studio verwenden, ist es auch ziemlich einfach, sich durch die darin enthaltenen Dateien zu klicken.
Keine Kommentare:
Kommentar veröffentlichen