Flutter 中有状态和无状态小部件之间的关系是什么?

有状态小部件被定义为在其生命周期内改变其状态的任何小部件。但是对于 StatelessWidget来说,将 StatefulWidget作为它的子代之一是非常普遍的做法。如果 StatefulWidget作为它的子代之一,StatelessWidget不会变成有状态的吗?

我尝试查看作为 StatelessWidget代码一部分的文档,但是不能理解为什么一个 StatelessWidget可以将 Statefulwidget作为其子代而仍然保留 StatelessWidget

Flutter 中有状态和无状态小部件之间的关系和区别是什么?

70212 次浏览

无状态部件绝不会自己变成 重建(但是可以从外部事件变成 重建)。 状态部件可以。这是黄金法则。

任何类型的小部件都可以是 重新粉刷

无状态 仅意味着它的所有属性都是 永恒不变,更改它们的唯一方法是创建该小部件的新实例。它不会锁定小部件树。

但是你不应该关心你的孩子是什么类型的,这对你没有任何影响。

Stack Overflow 问题的答案——有状态 vs 无状态。

在 Flutter 中,区别在于无状态小部件可以由所有的构造函数参数单独定义。如果使用相同的参数创建两个无状态小部件,那么它们将是相同的。

但是,有状态小部件不一定与使用相同构造函数参数构建的另一个小部件相同。它可能处于不同的状态。
实际上,有状态的 小工具本身是不可变的(无状态的) ,但是 Flutter 管理一个单独的状态 对象并将其与小部件相关联,如
状态部件文档中所解释的。这意味着当 Flutter 重新构建一个有状态的小部件时,它将检查是否应该重用以前的状态对象,并且如果需要的话,将该状态对象附加到小部件。

父窗口小部件是无状态的,因为它不关心其子窗口小部件的状态。有状态的子元素本身(或技术上说是 Flutter)将处理它自己的状态。
在高层次上,我同意这使得父部件具有状态,因为两个父部件可能包含两个具有不同状态的子部件,因此在技术上他们自己是不同的。但是从 Flutter 的角度来看,它构建父窗口小部件时并不关心状态,只有在构建子窗口小部件时才会考虑其有状态性。

状态是在构建小部件时可以同步读取(1)的信息,以及(2)可能在小部件的生存期内发生更改的信息。小部件实现者有责任使用 State.setState 确保当状态发生变化时能够及时通知 State。

状态部件 :

有状态小部件是通过构建更具体地描述用户界面的其他小部件组合来描述部分用户界面的小部件。构建过程递归地继续,直到用户界面的描述完全具体(例如,完全由 RenderObjectWidgets 组成,它描述具体的 RenderObjects)。

当你描述的用户界面部分可以动态变化时,有状态的小部件是非常有用的,例如,由于内部时钟驱动的状态,或者取决于某些系统状态。对于仅依赖于对象本身中的配置信息和小部件所在的 BuildContext 的组合,可以考虑使用 StatelessWidget。

StatuseWidget 实例本身是不可变的,并将它们的可变状态存储在由 createState 方法创建的单独的 State 对象中,或者存储在 State 订阅的对象中,例如 Stream 或 ChangeNotifier 对象,对它们的引用存储在 StatefWidget 本身的 final 字段中。

StatelessWidget :

无状态小部件是通过构建更具体地描述用户界面的其他小部件组合来描述部分用户界面的小部件。构建过程递归地继续,直到用户界面的描述完全具体(例如,完全由 RenderObjectWidgets 组成,它描述具体的 RenderObjects)。

当您描述的用户界面部分不依赖于对象本身中的配置信息以及充满了小部件的 BuildContext 之外的任何东西时,无状态小部件是非常有用的。对于可以动态更改的组合,例如,由于具有内部时钟驱动的状态,或者取决于某些系统状态,可以考虑使用 StatuseWidget。

来自 颤抖,我的文档:

... 这里需要注意的重要一点是,无状态部件和有状态部件的核心行为是相同的。它们重新构建每个帧,区别在于 StatefutionWidget 有一个 State 对象,它跨帧存储状态数据并恢复它。

如果您有疑问,那么一定要记住这条规则: 如果一个小部件发生了变化(例如,用户与它交互) ,它就是有状态的。但是,如果一个子元素对更改作出反应,那么包含它的父元素仍然可以是一个无状态的小部件,如果父元素对更改没有反应的话。

就像颤动文档里提到的

有什么意义呢?

有些小部件是有状态的,有些是无状态的。 如果一个小部件发生变化ーー例如,用户与它交互ーー它就是有状态的。 小部件的状态由可更改的值组成,如滑块的当前值或是否选中复选框。 小部件的状态存储在 State 对象中,将小部件的状态与其外观分开。 当小部件的状态发生变化时,state 对象调用 setState () ,告诉框架重新绘制小部件。

无状态的小部件没有要管理的内部状态。

有状态的小部件是动态的。用户可以与有状态小部件进行交互(例如,通过在表单中键入内容,或者移动滑块) ,或者随着时间的推移而改变(可能是数据提要导致 UI 更新)。复选框、 Radio、 Slider、 InkWell、 Form 和 TextField 是有状态窗口小部件的示例,它们的子类是 StatueWidget。

Https://flutter.io/tutorials/interactive/#stateful-stateless

无状态小部件 是静态小部件。在初始化无状态小部件之前,只需要传递几个属性。它们不依赖于任何数据更改或任何行为更改。例如。文本、图标、提升按钮都是无状态部件。

有状态小部件 是动态小部件,它们可以在运行时根据用户操作或数据更改进行更新。 如果一个小部件可以在运行时更改它的状态,那么它将是有状态的小部件。

编辑15/11/2018

如果输入/外部数据发生更改,则无状态 Widgets 可以重新呈现(外部数据是通过构造函数传递的数据)。因为无状态部件没有状态,所以它们只会呈现一次,不会自我更新,而只会在外部数据更改时更新。

有状态部件有一个内部状态,如果输入数据发生变化或 Widget 的状态发生变化,它可以重新呈现。

无状态和有状态小部件都有不同的生命周期。

无状态 : Widget 状态显式地创建 ONLY ONCE,然后 它可以更新值,但不能更新状态。这从结构上也很清楚。这就是为什么它只有一个类用 StatelessWidget扩展。所以如果我说,他们再也不能重新运行 build()方法了。

有状态的 : Widgets 可以更新他们的状态(本地)和价值多次事件触发。这就是原因,实现也是不同的。在这里,我们有两个类,一个是 StatefulWidget,另一个是它的状态实现处理程序,即 State<YourWidget>。因此,如果我说,他们可以重新运行 build()方法一次又一次基于触发的事件。

下图将有所帮助。

enter image description here

我能想到一个非常简单的类比。你有一些带有书籍、装饰品和电视的家具。家具是无国籍的,什么都不能动。在电视机的另一端,你可以打开、关闭、换台,如果附带 DVD,还可以播放电影,等等。电视的内部状态影响着它的行为方式。在家具中你没有状态。电视的存在并没有给家具增加一种状态。 希望这个能帮上忙。

免责声明:-从上周开始研究 flutter:)

Statless 有国籍的小部件有自己的生命周期来创建和更新 UI。然而,你可以使用无状态或有状态来渲染 UI,但实际上有状态更方便,当 UI 是完全或部分依赖于外部数据(如使用 api 渲染列表) ,而使用无状态小部件来渲染静态 UI 像任何输入屏幕是一个很好的做法。

简而言之:

正如我们所知道的,每个小部件都是一个不稳定的视图。它有自己的类。当我们使用这些类时,我们为它创建一个对象。我们给它们不同的变量/属性赋值。前女友。我们正在创建文本小部件,所以我们可以给它字符串,颜色,字体大小,字体系列。所以通过给出它,我们在创建它的同时定义了它的属性。到目前为止,无状态或有状态小部件是相同的,但是,

当我们想要一次又一次地更改/更新它的属性(比如字符串或颜色) ,那么它应该是有状态的小部件。

当我们不想在第一次定义它是一个无状态的小部件之后更改它的属性时。

这意味着我们关心小部件保存/控制/显示的数据。

因此,Stateless 是数据较少的,而 Stateful 是数据满的。

现在如果你定义一个无状态的类,这意味着这个类不关心/有变量,或者在它自己的类中说数据,比如类级别,但是它可能有另一个关心数据的 widget/类,比如它是有状态的。所以它们之间不会产生任何影响。

如果我说错了,请纠正我。

什么是有状态和无状态小部件?

DR: 允许刷新屏幕的小部件是一个有状态的小部件。不这样做的小部件是无状态的。

更详细地说,具有可更改内容的动态小部件应该是有状态小部件。无状态小部件只有在参数发生更改时才能更改内容,因此需要在小部件层次结构中其位置的上方进行更改。包含静态内容的屏幕或小部件应该是无状态的小部件,但是要更改内容,需要是有状态的。

我在一个有趣的媒体故事中找到了这个相关的内容。不客气!

什么是有状态和无状态小部件?

无状态小部件: 无状态小部件只有在其父级更改时才构建。

状态小部件: 状态完整小部件保存小部件的状态,并且可以在状态更改时重新构建。