从Flutter中的Firestore查询单个文档(cloud_firestore插件)

bla*_*ian 12 querying dart firebase flutter google-cloud-firestore

我只想通过其ID 检索单个文档的数据。我的示例数据方法:

TESTID1 {
     'name': 'example', 
     'data': 'sample data',
}
Run Code Online (Sandbox Code Playgroud)

是这样的:

Firestore.instance.document('TESTID1').get() => then(function(document) {
    print(document('name'));
}
Run Code Online (Sandbox Code Playgroud)

但这似乎不是正确的语法。

我找不到有关在flutter(飞镖)中查询firestore的任何详细文档,因为firebase文档仅解决了本机WEB,iOS,Android等问题,而没有解决Flutter。cloud_firestore的文档也太短了。只有一个示例显示了如何将多个文档查询到流中,这不是我想要的。

有关缺少文档的相关问题:https : //github.com/flutter/flutter/issues/14324

从单个文档中获取数据并不难。

更新:

Firestore.instance.collection('COLLECTION').document('ID')
.get().then((DocumentSnapshot) =>
      print(DocumentSnapshot.data['key'].toString());
);
Run Code Online (Sandbox Code Playgroud)

不执行。

Ale*_*amo 26

但这似乎不是正确的语法。

这是不正确的语法,因为您错过了collection()通话。您无法document()直接致电Firestore.instance。要解决此问题,您应该使用以下方法:

var document = await Firestore.instance.collection('COLLECTION_NAME').document('TESTID1');
document.get() => then(function(document) {
    print(document('name'));
}
Run Code Online (Sandbox Code Playgroud)

或者以更简单的方式:

var document = await Firestore.instance.document('COLLECTION_NAME/TESTID1');
document.get() => then(function(document) {
    print(document('name'));
}
Run Code Online (Sandbox Code Playgroud)

如果要实时获取数据,请使用以下代码:

Widget build(BuildContext context) {
  return new StreamBuilder(
      stream: Firestore.instance.collection('COLLECTION_NAME').document('TESTID1').snapshots(),
      builder: (context, snapshot) {
        if (!snapshot.hasData) {
          return new Text("Loading");
        }
        var userDocument = snapshot.data;
        return new Text(userDocument["name"]);
      }
  );
}
Run Code Online (Sandbox Code Playgroud)

它还将帮助您将名称设置为文本视图。

  • 您还应该使用`await`。请查看我更新的答案。现在可以用吗? (3认同)
  • 知道了。现在传递“userDocument.dat”,这是实际的地图(/sf/ask/3970518611/) (3认同)
  • 您指出的错误是正确的,但不是主要问题。根据 AndroidStudio:`DocumentReference 的 getter 未定义`。所以`document().get()` 也是无效的。我发现缺少有关这些查询的基本语法的信息。我什至阅读了 [规范](https://pub.dartlang.org/documentation/firebase_firestore) (2认同)

小智 20

如果要使用 where 子句

await Firestore.instance.collection('collection_name').where(
    FieldPath.documentId,
    isEqualTo: "some_id"
).getDocuments().then((event) {
    if (event.documents.isNotEmpty) {
        Map<String, dynamic> documentData = event.documents.single.data; //if it is a single document
    }
}).catchError((e) => print("error fetching data: $e"));
Run Code Online (Sandbox Code Playgroud)


小智 8

这很简单,您可以使用 DOCUMENT SNAPSHOT

DocumentSnapshot variable = await Firestore.instance.collection('COLLECTION NAME').document('DOCUMENT ID').get();
Run Code Online (Sandbox Code Playgroud)

您可以使用访问其数据 variable.data['FEILD_NAME']


jo3*_*ght 6

更新 FirebaseFirestore 12/2021

StreamBuilder(
          stream: FirebaseFirestore.instance
              .collection('YOUR COLLECTION NAME')
              .doc(id) //ID OF DOCUMENT
              .snapshots(),
        builder: (context, snapshot) {
        if (!snapshot.hasData) {
          return new CircularProgressIndicator();
        }
        var document = snapshot.data;
        return new Text(document["name"]);
     }
  );
}
Run Code Online (Sandbox Code Playgroud)


Cop*_*oad 5

空安全码(推荐)

您可以在函数(例如按下按钮时)或小部件(例如FutureBuilder)中查询文档。

  • 在一种方法中:(一次听)

    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.
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • FutureBuilder(一次听)

    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());
      },
    )
    
    Run Code Online (Sandbox Code Playgroud)
  • 在一个StreamBuilder:(一直在听)

    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());
      },
    )
    
    Run Code Online (Sandbox Code Playgroud)