@TryLoveCatch
2020-06-02T19:55:27.000000Z
字数 2010
阅读 1401
flutter
https://juejin.im/post/5ca81c80e51d4509f8232e9b
https://juejin.im/post/5d1209e6e51d454d56535822
这个函数不属于生命周期,但是构造函数必然是要第一个调用的。
确切的说StatelessWidget 的生命周期只有这一个。
主要是用来创建 Widget 的,但因为 build 在每次界面刷新的时候都会调用,所以不要在 build 里写业务逻辑,可以把业务逻辑写到你的 StatelessWidget 的构造函数里。
这个函数不属于生命周期,但是构造函数必然是要第一个调用的。
确切的说StatefulWidget 的生命周期只有着一个。
createState 是 StatefulWidget 里创建 State 的方法,当要创建新的 StatefulWidget 的时候,会立即执行 createState,而且只执行一次。
https://segmentfault.com/a/1190000015211309
在 StatefulWidget 第一次创建的时候,initState 是 创建完后调用的第一个方法,而且在生命周期中只调用一次。
这里可以做一些初始化工作,比如初始化State的变量。
initState 的时候必须要调用 super.initState()。
在 StatefulWidget 第一次创建的时候,didChangeDependencies 方法会在 initState 方法之后立即调用。
之后当 StatefulWidget 刷新的时候,就不会调用了,除非你的 StatefulWidget 依赖的 InheritedWidget 发生变化之后,didChangeDependencies 才会调用,所以 didChangeDependencies 有可能会被调用多次。
在 StatefulWidget 第一次创建的时候,build 方法会在 didChangeDependencies 方法之后立即调用;
另外一种会调用 build 方法的场景是,每当 UI 需要重新渲染的时候,build 都会被调用,所以 build 会被多次调用,然后 返回要渲染的 Widget。
千万不要在 build 里做除了创建 Widget 之外的操作,因为这个会影响 UI 的渲染效率。
当组件的状态改变的时候就会调用didUpdateWidget,比如调用了setState.
flutter框架会创建一个新的Widget,绑定本State,并在这个函数中传递老的Widget。
这个函数一般用于比较新、老Widget,看看哪些属性改变了,并对State做一些调整。
当要将 State 对象从渲染树中移除的时候,就会调用 deactivate 生命周期,这标志着 StatefulWidget 将要销毁,但是有时候 State 不会被销毁,而是重新插入到渲染树种。
当 View 不需要再显示,从渲染树中移除的时候,State 就会永久的从渲染树中移除,就会调用 dispose 生命周期,这时候就可以在 dispose 里做一些取消监听、动画的操作,和 initState 是相反的。
addPostFrameCallback是单次Frame绘制回调,只会被调用一次,如果要再次监听需要再设置。
addPostFrameCallback 的使用方法是在 initState 里添加回调:
import 'package:flutter/scheduler.dart';
@override
void initState() {
super.initState();
SchedulerBinding.instance.addPostFrameCallback((_) => {});
}
这个api在每次绘制Frame结束后都会回调,我们可以利用它做一些帧率检测。
WidgetsBinding.instance.addPersistentFrameCallback((_){
print("Frame has been rendered");
});
- | 调用次数 | 是否支持setState |
---|---|---|
构造函数 | 1 | 否 |
initState | 1 | 无效(使用setState和不使用一样) |
didChangeDependencies | >=1 | 无效 |
didUpdateWidget | >=1 | 无效 |
deactivate | >=1 | 否 |
dispose | 1 | 否 |
监听App 的生命周期,例如 Flutter 是在前台还是在后台,需要使用WidgetsBindingObserver