我在Flutter中有一个应用程序可以在父屏幕中提取大量数据。父屏幕分为几个子屏幕,而子屏幕又进入了几个子屏幕。
现在,为了确保这不会一直从API中提取数据,我只在根屏幕中将其提取一次-90%的时间都可以。
所有后续更新都通过Firebase云消息传递在整个应用程序中广播
如果我在屏幕3上,则需要更新屏幕1上的数据,该数据也应更新最终将在屏幕2上显示的数据。我目前正在使用此方法来传递数据({{3} })
例如,屏幕1包含三个项目。每个项目都有自己的屏幕。
屏幕2.1用于项目1,屏幕2.2用于项目2,依此类推。
在屏幕2.1中,有n个待办事项列表。
现在,如果我打开待办事项列表,则进入屏幕3,其中包含项目1的第一个待办事项列表的数据。
在firebase云消息传递数据通知中,我接收到此待办事项列表的新信息以及项目2待办事项列表1的待办事项列表中的某些内容。
如何保持一致性并全面更新数据?
我是否需要更改架构并使用Redux或类似的东西?
答案 0 :(得分:0)
这个问题实际上与维护整个应用程序的状态有关。 Flutter支持多种维护状态的方法。这取决于您要构建的内容。
Inherited Widget:这是最简单的方法,但是当状态必须保持深入到小部件树中时,它具有缺点。
Scoped Model:此软件包对于维护子孙后代的状态非常有用。
Streams(BLoC):这是维护应用程序状态的最佳方法。 Flutter使用类似的过程来维护应用程序小部件树中的状态。在颤动中,一切基本上都是流。
更多有关BLoC实施的资源。 Flutter Show BloC Pattern implementation
答案 1 :(得分:0)
很好的问题!
您将需要一个中央“数据服务”,作为单一事实来源。
它将加载初始数据并将其存储在内部,还会在云消息到达时更新数据,并通知所有依赖于数据的小部件数据已更改。
屏幕从不存储数据的可变副本,而是查询数据服务以获取最新数据。
根据应用程序的复杂性,有不同的解决方案可以使用流,也可以不使用流。
InheritedWidget
是Flutter随附的基本解决方案。通常,您会拥有一个StatefulWidget
和一个State
,并用一个MaterialApp
来包裹您的InheritedWidget
,以便将State
广播到屏幕上。
scoped_model是InheritedWidget
的薄包装,但是基本上提供了相同的功能。同样,模型提供者必须包装您的MaterialApp
,以使其在所有屏幕上都可用。
BLoC和flutter_redux是更高级的解决方案。