Ausgabe
Bearbeiten: Diese Frage ist veraltet, und ich bin sicher, dass ab sofort neue Dokumentationen und neuere Antworten verfügbar sind.
Ich möchte Daten von nur einem einzelnen Dokument über seine ID abrufen. Mein Ansatz mit Beispieldaten von:
TESTID1 {
'name': 'example',
'data': 'sample data',
}
war sowas:
Firestore.instance.document('TESTID1').get() => then(function(document) {
print(document('name'));
}
aber das scheint keine korrekte Syntax zu sein.
Ich konnte keine detaillierte Dokumentation zum Abfragen von Firestore in Flutter (Dart) finden, da die Firebase-Dokumentation nur Native WEB, iOS, Android usw. anspricht, aber nicht Flutter. Die Dokumentation von cloud_firestore ist auch viel zu kurz. Es gibt nur ein Beispiel, das zeigt, wie mehrere Dokumente in einen Stream abgefragt werden, was nicht das ist, was ich tun möchte.
Verwandtes Problem zu fehlender Dokumentation:
https://github.com/flutter/flutter/issues/14324
Es kann nicht so schwer sein, Daten aus einem einzelnen Dokument zu erhalten.
AKTUALISIEREN:
Firestore.instance.collection('COLLECTION').document('ID')
.get().then((DocumentSnapshot) =>
print(DocumentSnapshot.data['key'].toString());
);
wird nicht ausgeführt.
Lösung
Null-Safe-Code (empfohlen)
Sie können das Dokument entweder in einer Funktion (z. B. auf Knopfdruck) oder in einem Widget (z. B. einem ) abfragen FutureBuilder
.
-
In einer Methode: (einmal zuhören)
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. }
-
In einem
FutureBuilder
(einmaliges Anhören)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()); }, )
-
In a
StreamBuilder
: (hört immer zu)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()); }, )
Beantwortet von – CopsOnRoad
Antwort geprüft von – Marilyn (FixError Volunteer)