繁体   English   中英

如果 flutter 中的有状态小部件可以实现无状态小部件,为什么我们需要无状态小部件?

[英]Why do we need stateless widgets if the same can be achieved by stateful widgets in flutter?

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

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

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

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

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

编辑

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

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

StatelessWidget 的存在是为了将大的小部件树拆分为较小的可重用小部件。

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

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

从他们的文档

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

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

这里有更多关于这个的信息。

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

更多关于这个:)

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

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

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

从理论上讲,我认为你可以在任何地方使用有状态的小部件,但你的整个程序会更重并且会有很多冗余。 也就是说,我不认为使用无状态小部件比有状态小部件有任何优势。

这是我的理解...

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

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

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

我希望我有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM