颤抖initState()与build()?

时间:2018-08-16 00:10:31

标签: flutter state

相对于有状态的小部件中的initState(),我何时将代码放入build()感到困惑。我正在对Flutter的“胆识性”课程进行测验,该课程有this个待办事项,这是将代码块从build()移到initState()。但是我不知道这样做的目的或优势。为什么不将所有代码都放在build()中呢?

在每次状态更改时build()仅被调用一次而initState()被调用一次吗?

谢谢。

2 个答案:

答案 0 :(得分:6)

这实际上是相反的。

在许多情况下可以再次调用

build。例如状态更改或父级重建。

initState仅被调用一次。

build仅应用于布局。 initState通常用于变量初始化。

答案 1 :(得分:2)

它在您提供的link的构建状态中的注释中。

 Widget build(BuildContext context) {
    // TODO: Instead of re-creating a list of Categories in every build(),
    // save this as a variable inside the State object and create
    // the list at initialization (in initState()).
    // This way, you also don't have to pass in the list of categories to
    // _buildCategoryWidgets()
     final categories = <Category>[];  
     ...

在构建状态中创建类别列表将导致在每个构建中创建该列表。这是必需的,因为您只希望创建一次,所以最好的方法是在initState()中,因为它只会在创建状态对象时被调用一次,从而省去了重新创建类别的开销每个版本。

根据flutter文档:
InitState

  

将此对象插入树中时调用。
  框架将为它创建的每个State对象只调用一次此方法。
  重写此方法以执行初始化,具体取决于将此对象插入树中的位置(即上下文)或用于配置此对象的小部件(即小部件)

构建

  

框架在许多不同的情况下调用此方法:
  调用initState之后。
  调用didUpdateWidget之后。
  收到对setState的调用之后。
  在此State对象的依存关系发生更改之后(例如,先前的构建所引用的InheritedWidget发生了更改)。