面试题答案
一键面试1. 创建阶段
createState
:- 触发时机:当
StatefulWidget
被插入到Widget树时调用,用于创建与其关联的State
对象。 - 典型用途:返回一个新的
State
实例,这个实例将负责管理该StatefulWidget
的可变状态。例如,对于一个显示计数器的StatefulWidget
,在createState
中创建的State
会包含计数器的状态变量和改变计数器的方法。
- 触发时机:当
2. 初始化阶段
initState
:- 触发时机:在
State
对象被创建后,插入到Widget树之前调用,只会调用一次。 - 典型用途:进行一些一次性的操作,如初始化状态变量、订阅流(Stream)、发起网络请求等。例如,初始化计数器的初始值,或者初始化用于获取数据的网络请求客户端。
- 触发时机:在
3. 构建阶段
build
:- 触发时机:每当Widget需要构建或重新构建时调用,包括初始化后、状态改变后、父Widget改变导致其自身配置改变时等。
- 典型用途:构建Widget树,根据当前状态返回相应的Widget结构。例如,根据计数器的当前值,构建显示当前计数值的文本Widget。
4. 状态改变阶段
didUpdateWidget
:- 触发时机:当Widget的配置(如传递的参数)发生变化时调用,此时旧的Widget会被新的Widget替换,但
State
对象会被复用。 - 典型用途:比较新旧Widget的配置,必要时更新状态。例如,一个接受外部数据作为参数的列表Widget,当外部数据变化时,在此方法中对比新旧数据,并决定是否更新列表的显示。
- 触发时机:当Widget的配置(如传递的参数)发生变化时调用,此时旧的Widget会被新的Widget替换,但
setState
:- 触发时机:当调用
setState
方法时,它会标记State
对象需要重新构建,进而触发build
方法。 - 典型用途:用于改变
State
对象中的状态变量,并通知Flutter框架状态已改变,以便重新构建Widget。例如,在计数器Widget中,点击按钮增加计数器的值后,调用setState
通知框架重新构建,以显示更新后的计数值。
- 触发时机:当调用
5. 依赖变化阶段
didChangeDependencies
:- 触发时机:当
State
对象依赖的InheritedWidget发生变化时调用,或者在initState
之后调用。 - 典型用途:当依赖的InheritedWidget数据改变时,更新自身状态。例如,如果一个Widget依赖于主题(Theme)这种InheritedWidget,当主题发生变化时,在这个方法中更新自身显示以适配新主题。
- 触发时机:当
6. 销毁阶段
dispose
:- 触发时机:当
State
对象从Widget树中移除时调用,只会调用一次。 - 典型用途:进行一些清理操作,如取消订阅流(Stream)、释放资源等。例如,取消之前发起的网络请求,避免内存泄漏。
- 触发时机:当