【问题标题】:When should i use streams vs just accessing the cloud firestore once in flutter?我什么时候应该使用流而不是只在颤动中访问云火库?
【发布时间】:2019-10-29 09:01:33
【问题描述】:

我想为我的应用创建一个群组功能,到目前为止,当我设置每个用户的个人资料页面时,我已经使用了这样的东西:

DocumentReference documentReference =
               _firestore.collection("users").document("$email");
               await documentReference.get().then((DocumentSnapshot datasnapshot) {
                 if (datasnapshot.exists) {
                   displayName=datasnapshot.data['displayName'].toString();
                   bio=datasnapshot.data['bio'].toString();
                   print(bio);
                 }
                 else {
                   print("No such user");
                 }

这可行,但我想如果我想创建组并记录不同用户可能做出的更改,那么我可能应该使用流,对吗?一般来说,如果有人可以提供一些见解,我不确定何时使用哪个?

【问题讨论】:

    标签: flutter dart stream google-cloud-firestore


    【解决方案1】:

    技术区别在于get只获取文档一次,而流会直接获取当前数据,然后继续监听变化。

    当我将数据直接显示到 UI 中时,我通常使用流(或其底层 onSnapshot()),因为这意味着每当数据更改时 UI 都会更新。这是非常酷的 Firebase 功能之一,因为它可以让您的 UI 对数据更改做出反应。我将get() 用于我只需要一次的东西,例如配置数据(虽然如果你使用流也很酷)、客户端连接等。

    【讨论】:

    • 好吧,这是有道理的,假设页面没有设置状态或更改值的按钮,那么流会更好,但如果页面确实有更改状态的按钮或按下时编辑值,然后在这种情况下使用 get 可能会更好?例如,如果我编辑或加载当前使用 get 的个人资料页面,因为除非他们专门去更改并单击按钮,否则数据不太可能更改,但是说消息传递系统可能会使用流,对吗?
    • 在最后一个例子中绝对是“是”。其他人则更有主见。例如,我倾向于在比大多数人更多的用例中看到反应式系统。所以你自己判断什么对你来说是合理的,如果你的观点随着时间的推移而改变,不要教条。
    【解决方案2】:

    这完全取决于您是否希望每次数据库发生变化时重新加载数据。

    • 如果您希望它随着数据库的变化而更新,使用 Stream(最有可能使用 StreamBuilder)

    • 如果您只想在重新加载屏幕时更新,请像在示例中一样使用 get()

    【讨论】:

    • 好的,谢谢,两者中的哪一个需要更多的电力,如果不必要地使用可能会减慢我的应用程序的速度?
    • StreamBuilder 肯定需要更多的功能,因为它每次更改时都会刷新并与数据库通信。只使用一个 get 将调用它一次,你就完成了。但是,除非您的应用程序非常庞大,否则使用 Stream 不应明显减慢它的速度。如果是这样,那么会有更好的实现,例如只流 10 个东西,然后如果用户滚动流 10 更多,等等。
    • 我想利用流的力量来不手动管理文档的更新/重新加载(例如,如果我使用 get,那么我每次都需要触发 pull 和 notifyListeners)。有没有办法告诉流“给我当前的流状态并且在页面位于堆栈顶部之前不要查找更改”?
    猜你喜欢
    • 2017-07-18
    • 2016-08-09
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 2019-05-09
    • 1970-01-01
    相关资源
    最近更新 更多