可以从 Firestore 快照 Flutter 中获取元数据吗?

Posted

技术标签:

【中文标题】可以从 Firestore 快照 Flutter 中获取元数据吗?【英文标题】:Possible to get metadata from Firestore snapshot Flutter? 【发布时间】:2019-07-28 00:43:24 【问题描述】:

我需要获取snapshot 元数据,以便检查写入 Firestore 是否成功。我查看source,发现有SnapshotMetadata 和布尔值hasPendingWrites()。但我找不到如何实施。没有开源 dart 项目使用过它。

Firebase doc 说可以使用:.onSnapshot / .addSnapshotListener 指定includeMetadataChanges: true

但我需要确保在查询 QuerySnapshot 时获得元数据。我将query 用于stream 而不是addSnapshotListener

像这样:

        child: new FirestoreAnimatedList(
          query: Firestore.instance.collection('Collection')
              .orderBy('timestamp', descending: true)
              .snapshots(),
          padding: new EdgeInsets.all(8.0),
          reverse: true,
          itemBuilder: (_, DocumentSnapshot snapshot,
              Animation<double> animation, int x) 
            return new Chat(
                snapshot: snapshot, animation: animation);
          ,
        ),

我已经尝试指定:

          query: Firestore.instance.collection('Collection')
              .snapshots(includeMetadataChanges: true),

但这不可能:

错误:未定义命名参数“includeMetadataChanges”。

我也试试:

snapshot.getMetadata().hasPendingWrites()

但是报错:

错误:没有为类定义方法“getMetaData” '文档快照'。

有谁知道在 Flutter 中如何做到这一点?有可能吗?

我尝试了这么久,但找不到方法..帮助!

谢谢!

【问题讨论】:

【参考方案1】:

增加了includeMetadataChanges参数

0.12.9 版本的 cloud_firestore 包中添加了 Flutter 对 includeMetadataChanges 参数的支持。

当您调用 snapshots() 函数时,您现在可以将其作为参数包含在内。

此示例返回集合中所有文档的,作为联系人列表。如果 includeMetadataChangesfalse(默认行为),则当元数据更改(例如 hasPendingWritesisFromCache)时,不会更新流。如果 true,则流会根据这些更改进行更新。

Stream<List<Contact>> getAllContactsStream() 
    return Firestore.instance.collection('contacts')
    .orderBy('name', descending: false)
    .snapshots(includeMetadataChanges: true)
    .map((snapshot) => snapshot.documents.map((document) => Contact.fromFirestore(document)).toList())

使用单个文档快照,可以使用 document.data 访问普通 Firestore 数据。使用document.metadata 访问元数据。

【讨论】:

【参考方案2】:

看起来DocumentSnapshot class in FlutterFire 没有公开底层文档的元数据。我会在Flutter repo 上提交功能请求。

【讨论】:

以上是关于可以从 Firestore 快照 Flutter 中获取元数据吗?的主要内容,如果未能解决你的问题,请参考以下文章

从 Stream 检索快照时,Flutter/Firestore 返回类型 List<Review> 不是“Map<String, dynamic>”类型的子类型

Flutter StreamBuilder中使用的Firestore快照在数据更改时永远不会更新

Flutter中的Firestore快照侦听器数据重复问题

Flutter:Firebase 身份验证和 Firestore 快照流

在 Flutter 中捕获云 Firestore 文档快照错误

Firestore 单文档快照流未更新