Flutter 颤振initState()与build()?

Flutter 颤振initState()与build()?,flutter,state,Flutter,State,与有状态小部件中的build()相比,我对何时将代码放入initState()感到困惑。我正在做一个关于Flatter的udacity课程的测验,该课程有一个待办事项,就是将一块代码从build()移动到initState()。但我不知道这样做的目的和好处。为什么不把所有的代码都放到build()中呢 是不是每次状态更改都只调用一次build(),而调用initState() 谢谢。事实恰恰相反 build在许多情况下都可以再次调用。例如状态更改或父级重建 而initState只调用一次 bui

与有状态小部件中的
build()
相比,我对何时将代码放入
initState()
感到困惑。我正在做一个关于Flatter的udacity课程的测验,该课程有一个待办事项,就是将一块代码从
build()
移动到
initState()
。但我不知道这样做的目的和好处。为什么不把所有的代码都放到
build()
中呢

是不是每次状态更改都只调用一次
build()
,而调用
initState()


谢谢。

事实恰恰相反

build
在许多情况下都可以再次调用。例如状态更改或父级重建

initState
只调用一次


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

它位于您提供的构建状态中的注释中

 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>[];  
     ...
小部件构建(构建上下文){
//TODO:不是在每个生成()中重新创建类别列表,
//将其另存为状态对象内的变量并创建
//初始化时的列表(在initState()中)。
//这样,您也不必将类别列表传递给
//_buildCategoryWidgets()
最终类别=[];
...
在生成状态下创建类别列表将导致在每个生成上创建列表。这是必要的,因为您只希望创建一次,所以最好在initState()中执行此操作因为在创建state对象时只调用一次,因此消除了在每个构建上重新创建类别的成本

根据颤振文件:
InitState

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

构建

框架在许多不同的情况下调用此方法:
在调用initState之后。
调用didUpdateWidget后。
在接到对setState的呼叫后。
此状态对象的依赖项更改后(例如,先前构建更改引用的继承小部件)


因此,如果我们通过initstate初始化列表并希望更新该列表的一些元素,我们将如何做?我们将从构建内部调用setstate以使这些更改显示在我们的ui中吗?那么如果我们通过initstate初始化列表并希望更新该列表的一些元素,我们将如何做?我们将从构建内部调用setstate以使这些更改显示在我们的ui中吗让这些变化出现在我们的ui@SanjaySingh使用
didUpdateWidget
didChangeDependencies
我也没有使用过。我只是想知道当我使用initstate初始化变量时,会发生什么,或者该怎么做,现在我想在列表中进行更改,然后在ui中显示