无状态和有状态小部件之间有什么区别?

时间:2017-08-29 09:58:11

标签: flutter

我正在学习Dart / flutter并尝试了解Widgets系统的工作原理。但我无法理解无状态小工具和有状态小工具之间的区别?比如我有按钮。它有什么类型?

让我们想象两个案例。 我发送文本到按钮,然后显示它。 我发送文本到按钮,它的颜色改变了。

如果我要创建不合适的Widget类型会是什么?

3 个答案:

答案 0 :(得分:10)

有三种小部件,而不仅仅是2.

  • 有状态小部件
  • 无状态小部件
  • 继承的小部件

无状态小部件就像一个常量。这是不可改变的。如果您想要更改无状态窗口小部件显示的内容,则必须创建一个新窗口。

状态小部件正好相反。它们还活着并且可以与用户交互。有状态小部件可以访问名为setState的方法,它基本上对框架说#34;您好,我想显示其他内容。你能重新描绘一下吗?"。

最后,继承的小部件是两个世界的混合体。它是不变的,无国籍的。但是另一个小部件(无论它是什么)可以订阅该继承的小部件。 这意味着当您用新的替换继承的窗口小部件时,将重新绘制已订阅旧窗口小部件的所有窗口小部件。

最后,通常会像控制器一样使用有状态小部件。 无状态小部件将像View一样使用。 继承的小部件将是您的配置文件或您的模型。

答案 1 :(得分:2)

根据flutter.io

无状态小部件

  

无状态小部件是不可变的,这意味着它们的属性不能   改变 - 所有价值都是最终的。

Here is doc

有状态小部件

  

状态小部件维护可能在生命周期内发生变化的状态   小部件。实现有状态小部件至少需要两个   classes:1)一个StatefulWidget类,它创建一个2)a的实例   国家级。 StatefulWidget类本身是不可变的,但是   状态类在窗口小部件的生命周期内持续存在。

例如,如果您想在按下按钮时更改文本小部件中的文本,则必须使用StatefulWidget,它将允许您更改变量的状态。

但是在StatelessWidget你不能这样做,因为它不会保持状态。

Read more from doc

This tutorial will help anyone who trying to understand these two

答案 2 :(得分:1)

查看Flutter Interactivity Tutorial

如果您的窗口小部件的build方法完全取决于其不可变的构造函数参数,则应使用StatelessWidget,因为它们更简单。如果您想存储一些预期会随时间变异的持久性私有数据,请使用StatefulWidget并将数据存储在State上。