【问题标题】:How to get a DocumentSnapshot for a specific document out of a QuerySnapshot?如何从 QuerySnapshot 中获取特定文档的 DocumentSnapshot?
【发布时间】:2019-08-04 09:04:49
【问题描述】:

为简单起见,假设我有两个屏幕:

  • StoriesListScreen
  • StoryDetailsScreen

为了填充StoriesListScreen,我使用Stream从Firestore获取一些数据:

Stream<QuerySnapshot> getFirstTenStories() {
    return _firestore.collection('stories').limit(10).snapshots();
}

然后我在StoriesListScreen 中的StreamBuilder 中使用这个Stream,并将它包含的文档映射到一些Story 对象。然后我使用ListView.builder 创建一些StoriesListTile 对象,将Story 对象作为参数,以便它们可以呈现列表中的每个对象。

所以一切都很好......

但是当用户点击StoriesListTile 时,我想打开StoryDetailsScreen 并显示该特定Story 对象的详细信息。

由于此时Story对象存在并且已经传入StoriesListTile对象,我可以很容易地将这个Story对象传入StoryDetailsScreen

 Navigator.of(context).push(MaterialPageRoute(builder: (context) => StoryDetailsScreen(_story));

所以它工作正常,但是......

我希望能够听到用于创建 Story 对象的数据的任何变化。

目前,如果我在 Firestore 中的数据发生更改,那么我在 StoriesListScreen 中的列表将自动更新,因为它使用了 Stream&lt;QuerySnapshot&gt;

我想在StoryDetailsScreen 中做同样的事情,但我传递给StoryDetailsScreen 屏幕的不是Stream,而是一个不会更新的Story 对象。

一种解决方案可能是从 Firestore 获取此故事数据,并在 StreamBuilder 中使用 Stream&lt;DocumentSnapshot&gt; StoryDetailsScreen,因此如果数据发生更改,它将自动更新。但这意味着浪费另一个 Firestore 读取,因为我已经有了这些数据。

那么如何将特定文档的Stream&lt;DocumentSnapshot&gt; 传递给我的StoryDetailsScreen?是否可以从我已有的Stream&lt;QuerySnapshot&gt; 中提取它?

【问题讨论】:

    标签: flutter dart google-cloud-firestore snapshot


    【解决方案1】:

    我真的很喜欢这个问题,你让我重新考虑我是如何编写我的应用程序的,我现在想知道现在是否还有更好的方法。谢谢!

    我认为从根本上说,这个问题是关于将业务逻辑(流中的数据)从 UI(当前加载的页面)中分离出来。

    我会考虑使用Provider 并创建一个服务来提供应用程序中的任何小部件都可以访问的流。这样,您就有了一个服务来监听变化、更新数据,并且应用程序中的所有其他内容都监听该流。

    这就是你要找的吗?

    编辑

    您是否需要为侦听数据库更改的流付费?

    答案是,“视情况而定”这是来自Cloud Fire-Store Billing documentation

    收听查询结果

    Cloud Firestore 允许您收听查询结果并在查询结果更改时获取实时更新。

    当您收听查询结果时,每次添加或更新结果集中的文档时,您都需要支付一次读取费用。当由于文档已更改而从结果集中删除文档时,您还需要支付读取费用。 (相比之下,删除文档后,您无需为阅读付费。)

    此外,如果侦听器断开连接的时间超过 30 分钟(例如,如果用户下线),您将被收取读取费用,就像您发出了全新的查询一样。

    【讨论】:

    • 感谢您的回答,大卫!是的,使用 Provider 可能是个好主意,我已经在使用一些应用级存储库来获取数据。但问题是提供一个只监听一个文档更改的流,而提供者仍然监听一个文档集合的流。但另一个问题是,如果您从 Firestore 获取文档,即使您之前已经获取过该文档(作为 QuerySnapshot 的一部分),并且该文档此后没有更改,是否还会向您收取一次阅读费用。我的问题是尽可能地提高成本效益。
    • 谢谢!我已经检查了几次文档,但他们没有得到这个场景的明确答案。但我终于在这里找到了一个类似的问题:stackoverflow.com/questions/53045198/…
    • 很高兴我能帮上忙。您介意将问题标记为已回答吗?
    猜你喜欢
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多