【发布时间】:2018-02-06 17:33:56
【问题描述】:
我正在学习 Dart/flutter 并试图了解 Widgets 系统的工作原理。但我不明白无状态和有状态小部件之间有什么区别?例如我有按钮。它有什么类型?
让我们想象两种情况。 我将文本发送到按钮并显示它。 我将文本发送到按钮,它会改变颜色。
如果我创建不正确的 Widget 类型会怎样?
【问题讨论】:
-
你的意思是“无状态”和“有状态”吗?
标签: flutter
我正在学习 Dart/flutter 并试图了解 Widgets 系统的工作原理。但我不明白无状态和有状态小部件之间有什么区别?例如我有按钮。它有什么类型?
让我们想象两种情况。 我将文本发送到按钮并显示它。 我将文本发送到按钮,它会改变颜色。
如果我创建不正确的 Widget 类型会怎样?
【问题讨论】:
标签: flutter
有 3 种小部件,而不仅仅是 2 种。
无状态小部件就像一个常量。它是不可变的。如果您想更改无状态小部件显示的内容,则必须创建一个新小部件。
有状态的小部件正好相反。它们是活的并且可以与用户交互。有状态的小部件可以访问名为 setState 的方法,该方法基本上是对框架说“你好,我想显示别的东西。你能重绘我吗?”。
最后,Inherited 小部件是两个世界的混合体。它是不可变的和无状态的。但是另一个小部件(无论它是什么)可以订阅该继承的小部件。 这意味着当您用新的小部件替换继承的小部件时,所有订阅旧小部件的小部件都将被重绘。
最后,有状态的小部件通常会像控制器一样使用。 无状态小部件将像视图一样使用。 继承的小部件将是您的配置文件或模型。
【讨论】:
根据flutter.io:
无状态小部件
无状态小部件是不可变的,这意味着它们的属性不能 改变——所有的值都是最终的。
有状态小部件
有状态小部件维护可能在生命周期内发生变化的状态 的小部件。实现一个有状态的小部件至少需要两个 类:1) 创建一个实例的 StatefulWidget 类 2) a 州级。 StatefulWidget 类本身是不可变的,但是 状态类在小部件的生命周期内持续存在。
例如,如果您想在按下按钮时更改文本小部件中的文本,则必须使用StatefulWidget,它可以让您更改变量的状态。
但是在 StatelessWidget 你不能这样做,因为它不保持状态。
This tutorial will help anyone who trying to understand these two.
【讨论】:
查看Flutter Interactivity Tutorial。
如果您的小部件的build 方法完全依赖于其不可变的构造函数参数,您应该使用StatelessWidget,因为它们更简单。如果您想存储一些您希望随着时间而改变的持久性私有数据,请使用StatefulWidget 并将数据存储在State 上。
【讨论】: