Flutter 状态
我们对状态这个概念并不陌生,Flutter中的StatefulWidget总会伴随着一个State对象而存在,State对象是StatefulWidget中状态的掌管者,使用它可以实现一种非常简单的状态管理方式——每个组件分离,它们各自管理自己内部的状态。
StatefulWidget通过构造函数初始化之后就会被放入组件树中,之后调用createState()函数创建它对应的State对象,创建的State对象会被Element对象持有。这时,我们就认为StatefulWidget已经挂载(mounted),也表示StatefulWidget的BuildContext对象(即Element实例)已经初始化。
接下来,Flutter就会继续调用State对象的一系列生命周期函数。
首先调用的是initState()函数,这个函数只被调用一次,子类可以继承该函数来实现自己内部状态的初始化。此时,State对象就已经初始化。之后就可以调用build()函数返回组件树来做实际的组件渲染工作。 在使用组件的过程中,可以通过调用setState()函数来更新State对象的状态值,在该方法内部调用了Element.markNeedsBuild()函数,将它对应的Element对象标记为dirty状态,表示它内部数据已经改变,之后就会触发build()重建新的Widget对象。
新的Widget对象创建后,就会调用State对象的didUpdateWidget()函数。这个函数会以旧的Widget对象作为参数,开发者可以重写这个函数以执行组件更新的操作,如新旧组件的动画过渡等。最后会调用build()函数完成Widget对象的重建,状态恢复为clean。 最后,如果在重建过程中包含State对象的Widget对象被移除(即组件类型或者key已经改变),Flutter就会调用dispose()函数释放这个State对象,我们可以在状态类中重写这个函数完成资源的释放,如停止正在活跃的动画等。
在State对象的整个生命周期中,一个名为didChangeDependencies的函数尤为特殊,我们在之前的分析中并没有提及它,因为它在调用initState()后执行一次,并不会因为State对象本身的状态改变而调用,仅仅在它所依赖的对象发生改变时才调用。State对象所依赖的对象就与下一节介绍的InheritedWidget息息相关