如何创建所有类和小部件都可以在 Flutter 中使用的通用数据源

Posted

技术标签:

【中文标题】如何创建所有类和小部件都可以在 Flutter 中使用的通用数据源【英文标题】:How to create a common source of data that all classes and widgets can use in flutter 【发布时间】:2019-05-19 22:53:08 【问题描述】:

我有多个类、小部件、列表视图和页面,它们使用来自云 Firestore 的相同数据。问题是每次我打开一个新页面时,我都必须从 Cloud Firestore 中获取与上一页相同的数据,这会增加文档的读取量。那么,我如何才能创建一个通用数据源,并随着云 Firestore 中值的更新而更新,而不仅仅是页面之间的正常数据传递。

也许使用新的提供程序包的一些解决方案可以提供帮助,但我不确定或创建一个所有类都可以收听的全局流,但我担心的是每次连接到流的读取都将被计算在内它只是计算读取次数的流的第一次初始化??

【问题讨论】:

嗯,这取决于应用程序类型。如果它需要实时更新,那么您必须使用 firstore 流(这意味着在每一页上阅读)。但是,如果您正在访问一个不会更改的特定日期,那么您可以存储在一个数组中并在任何地方访问它。我为此使用了范围模型,您也可以使用提供程序。 这取决于你的代码架构。试试 Redux 我的数据一直在变化,它是某种在线游戏,任何玩家都可以随时进入并改变一些东西 每当我必须为我的应用集中数据时,我有时会使用单例类。至于更改数据,您可以尝试在此单例中侦听实时更新。 @AliHussam 任何代码示例或 tut? 【参考方案1】:

我的应用还可以与 Cloud Firestore 配合使用,我使用 BLoC 从 Firestore 获取数据。当应用程序启动时,我主要调用我的 BLoC 类。 如果您没有太多的小部件,您可以将数据传递给您的小部件。如果您有很多小部件,您可以使用继承的小部件使数据可用于您应用中的所有小部件。

两个有趣的视频:

https://www.youtube.com/watch?v=fahC3ky_zW0

https://www.youtube.com/watch?v=Zbm3hjPjQMk

【讨论】:

如果我为 cloudfirestore 中的集合创建一个全局流并将多个小部件连接到它,这会导致多次读取还是仅由全局流生成的读取? 如果您使用 BLoC 并在 main 中读取数据,其他小部件将不会再次从 Firestore 读取数据。您只需将您的 BLoC 传递给其他小部件。您的应用只会在启动和 Firestore 发生变化时读取数据。【参考方案2】:

如果您的数据有变化的风险,那么您肯定希望使用 QuerySnapshot 订阅 Stream。如果您使用状态管理,您将能够将数据传递给任何需要它的小部件。避免放置。您在小部件中的查询。研究使用 BLoC (popular implementation)、provider + ChangeNotifiers 或 Streams,或其他状态管理解决方案。还有其他一些,但这些都是流行的完整选项。 Provider 本身并不能解决这个问题。不过,它可以为拼图提供一块。在游戏的这个阶段,你真的需要了解状态管理。它需要继续前进并保存您的读取和写入。

【讨论】:

以上是关于如何创建所有类和小部件都可以在 Flutter 中使用的通用数据源的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 提供者和小部件生命周期

如何在活动和小部件之间共享数据?

如何在 Flutter 中使用函数创建动态 TabBarView/渲染新 Tab?

Flutter 中的索引堆叠。如何在所有其他小部件之上显示容器?

Flutter:如何创建 Wrap 小部件 - 溢出警告

Flutter 布局相关知识点