繁体   English   中英

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

[英]What is the relation between stateful and stateless widgets in Flutter?

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

我尝试查看文档作为StatelessWidget代码的一部分,但无法弄清楚StatelessWidget如何将Statefulwidget作为其子项并仍然保持StatelessWidget

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

StatelessWidget永远不会自行重建(但可以从外部事件重建)。 StatefulWidget可以。 这就是黄金法则。

但是任何类型的小部件都可以随时重新绘制

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

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

有状态窗口小部件定义为在其生存期内更改其状态的任何窗口小部件。 但是,让StatelessWidget拥有StatefulWidget作为其子级之一是一种非常普遍的做法。 如果将StatefulWidget作为其子级之一, StatelessWidget不会变成有StatefulWidget吗?

我尝试将文档作为StatelessWidget代码的一部分进行研究,但无法弄清楚StatelessWidget如何将Statefulwidget作为其子级,并且仍然保持StatelessWidget

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

来自flutter.io的文档:

...这里要注意的重要一点是无状态和有状态小部件的核心行为相同。 他们重建每一帧,不同之处在于 StatefulWidget 有一个 State 对象,它跨帧存储状态数据并恢复它。

如果您有疑问,那么请始终记住这条规则:如果小部件发生变化(例如,用户与其交互),则它是有状态的。 但是,如果子级对更改做出反应,并且父级对更改没有反应,则包含的父级仍然可以是无状态小部件。

正如颤振文档中所述

重点是什么?

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

无状态小部件没有要管理的内部状态。 Icon、IconButton 和 Text 是无状态小部件的示例,它们是 StatelessWidget 的子类。

状态小部件是动态的。 用户可以与有状态的小部件进行交互(例如,通过在表单中​​输入内容或移动滑块),或者它会随时间发生变化(也许数据馈送会导致 UI 更新)。 Checkbox、Radio、Slider、InkWell、Form 和 TextField 是有状态小部件的示例,它们是 StatefulWidget 的子类。

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

状态是 (1) 可以在构建小部件时同步读取和 (2) 可能在小部件的生命周期内更改的信息。 小部件实现者有责任使用 State.setState 确保在此类状态更改时及时通知 State。

有状态小部件

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

当您描述的用户界面部分可以动态更改时,例如由于具有内部时钟驱动状态或取决于某些系统状态,有状态小部件很有用。 对于仅依赖于对象本身的配置信息和小部件在其中膨胀的 BuildContext 的组合,请考虑使用 StatelessWidget。

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

无状态小部件

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

当您描述的用户界面部分不依赖于对象本身的配置信息和小部件在其中膨胀的 BuildContext 之外的任何其他内容时,无状态小部件很有用。 对于可以动态更改的组合,例如由于具有内部时钟驱动状态或取决于某些系统状态,请考虑使用 StatefulWidget。

无状态小部件是静态小部件。 您只需要在初始化无状态小部件之前传递几个属性。 它们不依赖于任何数据更改或任何行为更改。 例如。 Text、Icon、RaisedButton 是无状态小部件。

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

编辑 15/11/2018

如果输入/外部数据发生变化(外部数据是通过构造函数传递的数据),无状态小部件可以重新渲染。 因为Stateless Widgets没有状态,它们会被渲染一次,不会自己更新,只会在外部数据发生变化时更新。

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

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

我能想到一个非常简单的比喻。 你有一些带有书籍、装饰品和电视的家具。 家具是无状态的,它什么都不做也不动。 在电视的另一侧,您可以打开、关闭、更改频道、播放电影(如果连接了 DVD)等。电视具有影响其行为方式的内部状态。 在家具中,您没有状态。 电视在家具中的存在并没有给它增加一种状态。 希望这可以帮助。

在编写应用程序时,您通常会创作作为StatelessWidgetStatefulWidget子类的新小部件

以下是StatelessWidgetStatefulWidget之间的一些差异:

无状态小部件:

  1. 具有不可变状态的小部件。
  2. 无状态小部件是静态小部件。
  3. 它们不依赖于任何数据更改或任何行为更改。
  4. Stateless Widgets 没有状态,它们会被渲染一次并且不会自我更新,只会在外部数据发生变化时更新。
  5. 例如: TextIconRaisedButton是无状态小部件。

有状态小部件:

  1. 具有可变状态的小部件。
  2. 有状态小部件是动态小部件。
  3. 它们可以在运行时根据用户操作或数据更改进行更新。
  4. 有状态的小部件有一个内部状态,如果输入数据发生变化或者小部件的状态发生变化,它可以重新渲染。
  5. 例如: CheckboxRadio ButtonSlider是有状态的小部件

Stack Overflow 问题的答案 - statefulness vs stateless

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

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

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

无状态:小部件状态仅创建一次,然后它可以更新值但不能显式更新状态 从那里的结构也可以清楚地看出这一点。 这就是为什么它只有一个类扩展了StatelessWidget 因此,如果我说,他们永远无法再次运行build()方法。

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

下图会有所帮助。

在此处输入图片说明

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

TL;DR:允许您刷新屏幕的小部件是有状态小部件。 没有状态的小部件是无状态的。

更详细地说,一个内容可以改变的动态小部件应该是一个有状态的小部件。 无状态小部件只能在更改参数时更改内容,因此需要在小部件层次结构中的位置点上方完成。 包含静态内容的屏幕或小部件应该是无状态小部件,但要更改内容,需要有状态。

我在一个有趣的媒体故事中发现了这个相关内容。 别客气!

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

无状态有状态小部件有自己的生命周期来创建和更新 UI。 但是,您可以使用无状态或有状态来呈现 UI,但当 ui 完全或部分依赖于外部数据(例如 - 使用 api 呈现列表)而使用无状态小部件呈现静态 ui 时,实际上有状态会更方便,就像任何输入屏幕一样一个很好的做法。

简单来说:

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

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

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

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

所以无状态是数据少,有状态是数据满。

现在,如果你定义了一个无状态的类,这意味着这个类不关心/有变量,或者说它自己的类中的数据,即类级别,但它可能有另一个关心数据的小部件/类,即它是有状态的. 所以对彼此没有任何影响。

如果我在这里错了,请纠正我。

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

无状态小部件:无状态小部件仅在其父更改时构建。

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

暂无
暂无

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

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