相对于有状态的小部件中的initState()
,我何时将代码放入build()
感到困惑。我正在对Flutter的“胆识性”课程进行测验,该课程有this个待办事项,这是将代码块从build()
移到initState()
。但是我不知道这样做的目的或优势。为什么不将所有代码都放在build()
中呢?
在每次状态更改时build()
仅被调用一次而initState()
被调用一次吗?
谢谢。
答案 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发生了更改)。