Flutter的新手,请原谅这个问题。
我需要使用Stateful小部件来管理整个应用程序中的状态(变量/对象),这有点麻烦,但是我知道方法了。
我看到有些软件包提供相似的功能(scoped_model
和provide
)-这些软件包带来了什么,它们解决了什么问题?在开始一种特定方法之前,我想我想问的是经验丰富的Flutter开发人员正在使用什么,为什么?
谢谢
答案 0 :(得分:0)
主要与应用程序的可伸缩性和性能有关。使用StatefulWidget对于小型应用程序来说是很好的选择,但请想象一下,如果您有一个深度为30的小部件树,并且只有2个叶小部件需要知道一些counter
值,并且它们都位于小部件的相对两端树。使用StatefulWidget
方法,您必须将值放置在树的顶部并将其传递到整棵树中,以便2个小部件都可以获取它。然后,过一会儿,您需要在树的一个完全不相关的分支中使用另一个小部件来获得counter
-现在您需要修改整个分支以传递该值。然后,稍后,您决定将原始叶子之一移动到另一个位置-再次,您必须修改整个代码库以适应该情况。
使用InheritedWidget
使得provider
和scoped_model
都可以使用,您可以只在树的顶部注入counter
并简单地提取需要它的小部件。使用context
或等效的Consumer
从scoped_model
获得的值。这也将解决另一个问题:现在,中间小部件都不了解counter
,因此当值更改时,它们不再需要重建。现在,您可以随意移动窗口小部件,并根据需要添加/删除对counter
的依赖性,而不会在这样做时弄乱无关的窗口小部件。
您甚至可以更进一步,使用bloc
代替。我记得读过一篇比较所有方法的文章,发现bloc
可以通过消除一些构建来进一步提高应用程序的性能,尽管了解bloc
模式的运行可能有些艰巨首先。
答案 1 :(得分:0)
仅使用StatefulWidget还不错。。 您没有拥有使用provider / scoped_model。
StatefulWidgets功能非常强大,默认情况下可扩展。
它们的缺点是:
这些是InheritedWidgets解决的问题,所以provider / scoped_model也是如此。
但是您可以看到,这些主要是生活质量问题。 如果可以支持它们,则仅使用StatefulWidget是可以的。