【问题标题】:What difference between stateless and stateful widgets?无状态和有状态小部件有什么区别?
【发布时间】:2018-02-06 17:33:56
【问题描述】:

我正在学习 Dart/flutter 并试图了解 Widgets 系统的工作原理。但我不明白无状态和有状态小部件之间有什么区别?例如我有按钮。它有什么类型?

让我们想象两种情况。 我将文本发送到按钮并显示它。 我将文本发送到按钮,它会改变颜色。

如果我创建不正确的 Widget 类型会怎样?

【问题讨论】:

标签: flutter


【解决方案1】:

有 3 种小部件,而不仅仅是 2 种。

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

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

有状态的小部件正好相反。它们是活的并且可以与用户交互。有状态的小部件可以访问名为 setState 的方法,该方法基本上是对框架说“你好,我想显示别的东西。你能重绘我吗?”。

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

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

【讨论】:

    【解决方案2】:

    根据flutter.io

    无状态小部件

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

    Here is doc.

    有状态小部件

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

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

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

    Read more from doc.

    This tutorial will help anyone who trying to understand these two.

    【讨论】:

      【解决方案3】:

      查看Flutter Interactivity Tutorial

      如果您的小部件的build 方法完全依赖于其不可变的构造函数参数,您应该使用StatelessWidget,因为它们更简单。如果您想存储一些您希望随着时间而改变的持久性私有数据,请使用StatefulWidget 并将数据存储在State 上。

      【讨论】:

        猜你喜欢
        • 2018-08-11
        • 1970-01-01
        • 2021-07-31
        • 2016-04-03
        • 1970-01-01
        • 2021-05-03
        • 2019-08-03
        • 2012-10-10
        • 1970-01-01
        相关资源
        最近更新 更多