在运行时构建的通用Flutter应用中的状态管理

时间:2019-02-22 12:22:02

标签: flutter state-management

首先:我是stackoverflow和Flutter /声明性框架的新手,所以,如果我只是错过了寻找正确标签的机会,请原谅。

如何在运行时从头开始使用基本小部件构建的完全通用应用程序实现体面的状态管理?由于交互也是完全通用的,因此可能会从许多来源更改所有元素的所有状态。

我们目前正在为我们的应用程序管理系统开发一个移动客户端,并选择Flutter / Dart,因为我们不需要为iOS和Android使用两个完全不同的应用程序,但是现在我们在从前一个客户端实现命令式代码时遇到了一些困难Flutter中的应用程序(用AS,Objective-C,Java编写)。

我们系统中最重要的一点是,整个应用程序结构都保存在一个数据库中,该数据库在运行时下载,然后解析为具有父子关系的树状数据结构。此数据结构用于通过我们的基本自定义小部件(标签,图像,组等)构建UI。因此,整个应用程序是完全通用的。与应用程序的交互也是通用的,通常允许每个小部件的状态随时更改。元素的状态可以由多个源(通过全局处理的交互,由父级隐式处理的交互或具有状态链接以同步状态的其他任何元素)更改。

例如可以定义增加画廊页面的交互。画廊本身是具有三个子元素的组元素:图像,标签和作为背景的矩形。更改组的页面时,它会通知孩子页面已更改,然后他们会检查他们的所有设置(大小,位置,文件,文本等)是否需要更新。在这种情况下,图像的文件设置和标签的文本设置将被更新,因此代表这两个元素的两个小部件将需要重绘,而背景则不需要。无论如何要记住,这个库和交互是通用的,在运行时构建数据结构之前,我无法访问它们。画廊也可以包含一个附加标签,或者交互作用可以更改作为画廊父级的另一个组的状态。

当前解决方案

Kinda hacky,我使WidgetStates的setState()可用于元素的数据结构对象。目前,该方法有效,但我对适应框架的声明性感到不满意,并且我相信这迟早会产生错误。

研究

我已经阅读了一些有关scoped_modelBloCRedux的状态管理解决方案的文章,但似乎它们都可以与某种流/订阅一起使用,这似乎并不切实可行,因为我们将需要为每个小部件提供多个流。没有全局状态,每个元素都有自己的状态,但是每个人都必须可以访问该状态。

帮助

如果有人可以给我展示一个示例,其中实现了对每个元素的状态的完全访问而无需使数据结构对象可以使用setState()的巧妙方法,我将很高兴。当然,对我的假设提出的任何想法,暗示或修正都将受到赞赏。
预先感谢!

1 个答案:

答案 0 :(得分:0)

您可能想把头放在BloC概念上,该概念在Dart / Flutter中使用,Google也建议使用AFAIK。

这是将业务逻辑与UI代码分开的概念。
大多数教程都展示了如何将某些Web API与BloC正确集成,但是在您的情况下,您宁愿选择挂接到数据库源中。哪个应该没问题!

我会推荐 Felix Angelov的优秀库flutter_bloc,并推荐使用Flutter中的BloCs简介/教程。通过向您介绍几个不同的示例,他在解释系统方面做得很出色。

您可以在这里找到指南:https://felangel.github.io/bloc/#/gettingstarted