如何从flutter中的firestore文档字段中获取数据?

Posted

技术标签:

【中文标题】如何从flutter中的firestore文档字段中获取数据?【英文标题】:How to get data from firestore document fields in flutter? 【发布时间】:2019-11-27 08:28:54 【问题描述】:

我正在尝试在我的 Flutter 应用中测试 Firestore,但我无法真正按预期加载数据。

这就是我获取数据的方式:

 Firestore.instance
        .collection('Test')
        .document('test')
        .get()
        .then((DocumentSnapshot ds) 
      // use ds as a snapshot

      print('Values from db: $ds');
    );

打印语句输出:flutter: Values from db: 'DocumentSnapshot' 的实例。

我也尝试了以下方法,但没有成功:

Firestore.instance.collection('Test').document('test').get().then((data) 
  // use ds as a snapshot

  if (data.documentID.length > 0) 
    setState(() 
      stackOver = data.documentID;
      print(stackOver);
    );
  
);

这里的输出只是documentID-name..

那么,我如何从 firestore 获取字段值?

最好的问候!

【问题讨论】:

尝试使用 ds["fieldname"] 或 ds.fieldname 你有哪些字段?意思是你有什么型号,你能告诉我吗? @MuhammadNoman Test(Collection) -> test(document) -> stackTest: value(field-ref and value) @ParthPatel 谢谢,它适用于你的方法。 :) @RusbenWladiskoz 这是我的荣幸。你可以标记和支持我的评论:) 【参考方案1】:

空安全码:

一次性读取数据:

var collection = FirebaseFirestore.instance.collection('Test');
var docSnapshot = await collection.doc('test').get();
if (docSnapshot.exists) 
  Map<String, dynamic>? data = docSnapshot.data();

  // You can then retrieve the value from the Map like this:
  var value = data?['your_field'];

持续监听数据:

var collection = FirebaseFirestore.instance.collection('Test');
collection.doc('test').snapshots().listen((docSnapshot) 
  Map<String, dynamic>? data = docSnapshot.data();
  if (docSnapshot.exists) 
    Map<String, dynamic>? data = docSnapshot.data();

    // You can then retrieve the value from the Map like this:
    var value = data?['your_field'];
  
);

【讨论】:

【参考方案2】:

我遇到了类似的问题并以这种方式解决了它:

Stream<DocumentSnapshot> provideDocumentFieldStream() 
    return Firestore.instance
        .collection('collection')
        .document('document')
        .snapshots();

之后,我使用了一个 StreamBuilder 来使用上面创建的方法:

StreamBuilder<DocumentSnapshot>(
    stream: provideDocumentFieldStream(),
    builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) 
        if (snapshot.hasData) 
            //snapshot -> AsyncSnapshot of DocumentSnapshot
            //snapshot.data -> DocumentSnapshot
            //snapshot.data.data -> Map of fields that you need :)

            Map<String, dynamic> documentFields = snapshot.data.data;
            //TODO Okay, now you can use documentFields (json) as needed

            return Text(documentFields['field_that_i_need']);
        
    
)

【讨论】:

【参考方案3】:

试试这个:

final String _collection = 'collectionName';
final Firestore _fireStore = Firestore.instance;

getData() async 
  return await _fireStore.collection(_collection).getDocuments();


getData().then((val)
    if(val.documents.length > 0)
        print(val.documents[0].data["field"]);
    
    else
        print("Not Found");
    
);

【讨论】:

以上是关于如何从flutter中的firestore文档字段中获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用flutter更新firestore中所有文档的单个字段?

无法从 Firestore 文档中删除字段 (Flutter)

如何使用颤振删除 Firestore 文档中的字段

如何从 Flutter 将文档创建时间戳添加到 Firestore [重复]

如何使用 Flutter 在 Firestore 中检查多个文档中的特定值

当在文本字段中输入字段中的数据时,Flutter Firestore 显示文档 ID