首页 文章

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

提问于
浏览
20

有状态窗口小部件定义为在其生命周期内更改其状态的任何窗口小部件 . 但是_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @ StatelessWidget 如果有 StatefulWidget 作为其中一个孩子,是不是有状态?

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

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

6 回答

  • 3

    StatelessWidget永远不会重建(除非绑定到InheritedWidget) . 一个StatefulWidget可以 . 这是黄金法则 .

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

    无状态只意味着它的所有属性都是不可变的,并且更改它们的唯一方法是创建该窗口小部件的新实例 . 它没有例如锁定小部件树 .

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

  • 1

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

    StatefulWidget:

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

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

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

    StatelessWidget:

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

    当您描述的用户界面部分不依赖于对象本身中的配置信息以及窗口小部件膨胀的BuildContext时,无状态窗口小部件非常有用 . 对于可以动态改变的组合物,例如由于具有内部时钟驱动状态,或者取决于某些系统状态,请考虑使用StatefulWidget .

  • 19

    flutter.io的文档:

    ...这里需要注意的重要一点是无状态和有状态小部件的行为都是相同的 . 它们重建每一帧,区别在于StatefulWidget有一个State对象,它跨帧存储状态数据并恢复它 . 如果您有疑问,那么请始终记住此规则:如果窗口小部件发生更改(例如,用户与其交互),则它是有状态的 . 但是,如果孩子对更改做出反应,如果父级对更改没有反应,则包含父级仍可以是无状态小部件 .

  • 6

    StackOverflow question on statefulness vs statelessness .

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

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

    父窗口小部件是无状态的,因为它不关心其子状态 . 有状态的孩子本身(或技术上的颤动)将照顾自己的状态 .
    在较高的层面上,我同意这使得父窗口小部件有状态,因为两个父节点可能包含两个具有不同状态的子节点,因此在技术上不同 . 但是从Flutter的角度来看,它构建父小部件而不关心状态,只有在构建孩子时才会考虑它的国家性 .

  • 1

    正如颤动的文档中提到的那样

    重点是什么?

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

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

    stateful widget 是动态的 . 用户可以与有状态小部件交互(例如,通过键入表单或移动滑块),或者随着时间的推移而改变(可能是数据馈送导致UI更新) . Checkbox,Radio,Slider,InkWell,Form和TextField是有状态窗口小部件的示例,它们是StatefulWidget的子类 .

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

  • 8

    Statless Widgets 是静态小部件 . 在初始化无状态窗口小部件之前,您只需要传递一些属性 . 它们不依赖于任何数据更改或任何行为更改 . 例如 . Text,Icon,RaisedButton是无状态小部件 .

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

    Edit 15/11/2018

    如果输入/外部数据发生更改,则无状态窗口小部件可以重新加入 . 这里外部数据是通过构造函数传递的数据 .

    如果输入数据发生更改或Widget状态发生更改,则Statefull小部件可以重新进入 .

    但无状态小部件没有任何状态,因此它们将被渲染一次并且不会自行更新,但只有在外部数据发生变化时才会更新 . Statefull Widgets具有内部状态 .

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

相关问题