13

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

我们将无状态小部件用于未在显示屏上重绘的内容(如文本、按钮等),但有状态小部件可以自行重绘。

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

或者是否有任何特定的理由在颤振中使用无状态而不是有状态的小部件?或者我们可以一直使用有状态的小部件而不是只能绘制一次内容的无状态小部件吗?

谢谢,如果这是一个愚蠢的问题,我很抱歉。

编辑

那么问题不在于无状态和有状态之间的区别。我知道区别,但是只使用有状态小部件有什么影响,因为通过使用它,我们还可以实现无状态小部件可以做的大部分事情,那么为什么我们需要无状态小部件?它在颤振环境中的重要性是什么?的应用程序将不时重新绘制?

4

4 回答 4

4

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

StatelessWidget 的存在是为了将一个大的小部件树拆分成更小的可重用小部件。

您可能会想“但我可以为此使用 StatefulWidget 或函数”。这是真的,但不完全是:

  • StatefulWidget 带有一个巨大的样板文件,在那种情况下你不需要它。所以这只会增加噪音并使您的代码可读性降低。
  • 函数不能独立重建,也不能访问key和覆盖 ==。因此它们的性能可能会降低或引入错误。
于 2019-09-05T07:32:12.360 回答
2

从他们的文档中

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

有状态的小部件更消耗资源,您总是需要考虑性能。

这是有关此的更多信息。

将状态推到叶子上。例如,如果您的页面有一个滴答作响的时钟,而不是将状态放在页面顶部并在每次时钟滴答时重建整个页面,请创建一个仅更新自身的专用时钟小部件。

更多关于这个:)

我希望这回答了你的问题。

于 2019-09-05T05:36:51.287 回答
0

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

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

于 2021-04-13T08:40:10.707 回答
-1

这是我理解的...

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

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

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

我希望我能帮上一点忙。

于 2020-12-20T07:58:29.767 回答