如果有状态的窗口小部件可以在颤动中实现相同的功能,为什么我们需要无状态的窗口小部件?

时间:2019-09-05 05:19:03

标签: flutter statefulwidget statelesswidget

我是flutter领域的新手,最近我(或者我认为我了解了)有状态和无状态小部件,这是flutter小部件的基础。

我们使用无状态窗口小部件来处理未在显示器上重绘的内容(例如文本,按钮等),但是有状态窗口小部件可以自行重绘。

所以我的问题是,如果有状态窗口小部件可以用来绘制无状态窗口小部件可以绘制的相同类型的窗口小部件,为什么我们需要无状态窗口小部件?

还是有什么特定的原因在flutter中使用无状态的而不是有状态的小部件?还是我们可以一直使用有状态的小部件,而不是只能绘制一次内容的无状态的小部件?

谢谢,如果这是一个愚蠢的问题,请对不起。

编辑

问题不是无状态和有状态之间的区别。 我知道区别,但是仅使用有状态的小部件会有什么影响,因为通过使用它,我们还可以实现无状态的小部件可以执行的大多数事情,然后为什么我们需要无状态的小部件?在动荡的环境中,它的重要性是什么?的应用程序会不时被重新绘制?

4 个答案:

答案 0 :(得分:2)

来自他们的documentation

无状态窗口小部件在您描述的用户界面部分不依赖于对象本身以及膨胀了窗口小部件的BuildContext中的配置信息以外的任何部分时很有用。 (=不需要“在此处更新UI”时使用。)

有状态的小部件会消耗更多的资源,因此您始终需要考虑性能。

Here is more about this.

  

将状态推到叶子上。例如,如果您的页面上有一个勾号   时钟,而不是将状态放在页面顶部   每次时钟滴答时重新构建整个页面,创建一个   专用的时钟小部件,只会自我更新。

Even more on this :)

我希望这能回答您的问题。

答案 1 :(得分:0)

是的,StatefulWidget可以重建。通常在使用Inheritedwidgets时会发生这种情况。

StatelessWidget的存在是将大的窗口小部件树拆分成较小的可重用窗口小部件。

您可能会认为“但是我可以为此使用StatefulWidget或函数”。正确,但不完全正确:

  • StatefulWidget带有一个巨大的样板,在这种情况下您不需要。因此,这只会增加噪音,并使代码的可读性降低。
  • 功能不能进行独立重建,也无法访问key并覆盖==。因此,它们可能会降低性能或引入错误。

答案 2 :(得分:0)

每次我们使用 Stateful 小部件时,都会创建一个状态对象。如果我们使用所有 Stateful 小部件,将会有很多不必要的状态对象,这会消耗大量内存。因此,在不需要更改状态的地方,我们应该使用更简单的一个 - 无状态 小部件。

使用 Stateless 小部件而不是 Stateful 小部件的另一个原因是 Stateful 小部件带有一个巨大的样板,并且根据 Flutter API 文档 使用一堆嵌套的 Stateful 小部件,通过所有这些构建方法和构造函数传递数据会变得很麻烦。

答案 3 :(得分:-1)

这是我的理解...

当您使用有状态的小部件并重绘它时,内部的所有其他小部件也将被重绘。因此,我们尝试使用无状态小部件,以免重绘其中的其他小部件,但您知道我们通常需要更改屏幕上的数据,并且它应该发生在“单个小部件”中,并且该小部件应该是一个有状态小部件尽可能少地使用计算能力。

现在......我猜你在想:“但如果我只使用有状态的小部件而不重绘它们呢?”好吧,如您所知,当您使用有状态小部件时,您有两个类:小部件和状态。我已经知道,当您声明一个状态时,您会告诉手机无论是否重绘小部件,都将这个状态保存并保存在内存中,因此您可以无缘无故地使用手机内存,因为您不需要重绘其小部件。< /p>

我们应该考虑始终使用无状态小部件,因为它们比有状态小部件更轻,并且我们应该始终使我们的有状态小部件在我们的应用程序中最小,以便在应用程序的小部件树中重新绘制尽可能少的小部件。

希望能帮到你。