[关闭]
@TryLoveCatch 2020-06-02T11:55:27.000000Z 字数 2010 阅读 1250

Flutter之生命周期

flutter


https://juejin.im/post/5ca81c80e51d4509f8232e9b
https://juejin.im/post/5d1209e6e51d454d56535822

StatelessWidget生命周期

构造函数

这个函数不属于生命周期,但是构造函数必然是要第一个调用的。

build

确切的说StatelessWidget 的生命周期只有这一个。
主要是用来创建 Widget 的,但因为 build 在每次界面刷新的时候都会调用,所以不要在 build 里写业务逻辑,可以把业务逻辑写到你的 StatelessWidget 的构造函数里。

StatefulWidget生命周期

构造函数

这个函数不属于生命周期,但是构造函数必然是要第一个调用的。

createState

确切的说StatefulWidget 的生命周期只有着一个。
createState 是 StatefulWidget 里创建 State 的方法,当要创建新的 StatefulWidget 的时候,会立即执行 createState,而且只执行一次。

State生命周期

https://segmentfault.com/a/1190000015211309

initState

在 StatefulWidget 第一次创建的时候,initState 是 创建完后调用的第一个方法,而且在生命周期中只调用一次。
这里可以做一些初始化工作,比如初始化State的变量。
initState 的时候必须要调用 super.initState()。

didChangeDependencies

在 StatefulWidget 第一次创建的时候,didChangeDependencies 方法会在 initState 方法之后立即调用。
之后当 StatefulWidget 刷新的时候,就不会调用了,除非你的 StatefulWidget 依赖的 InheritedWidget 发生变化之后,didChangeDependencies 才会调用,所以 didChangeDependencies 有可能会被调用多次。

build

在 StatefulWidget 第一次创建的时候,build 方法会在 didChangeDependencies 方法之后立即调用;
另外一种会调用 build 方法的场景是,每当 UI 需要重新渲染的时候,build 都会被调用,所以 build 会被多次调用,然后 返回要渲染的 Widget。
千万不要在 build 里做除了创建 Widget 之外的操作,因为这个会影响 UI 的渲染效率。

didUpdateWidget

当组件的状态改变的时候就会调用didUpdateWidget,比如调用了setState.

flutter框架会创建一个新的Widget,绑定本State,并在这个函数中传递老的Widget。
这个函数一般用于比较新、老Widget,看看哪些属性改变了,并对State做一些调整。

deactivate

当要将 State 对象从渲染树中移除的时候,就会调用 deactivate 生命周期,这标志着 StatefulWidget 将要销毁,但是有时候 State 不会被销毁,而是重新插入到渲染树种。

dispose

当 View 不需要再显示,从渲染树中移除的时候,State 就会永久的从渲染树中移除,就会调用 dispose 生命周期,这时候就可以在 dispose 里做一些取消监听、动画的操作,和 initState 是相反的。

addPostFrameCallback

addPostFrameCallback是单次Frame绘制回调,只会被调用一次,如果要再次监听需要再设置。

addPostFrameCallback 的使用方法是在 initState 里添加回调:

  1. import 'package:flutter/scheduler.dart';
  2. @override
  3. void initState() {
  4. super.initState();
  5. SchedulerBinding.instance.addPostFrameCallback((_) => {});
  6. }

addPersistentFrameCallback

这个api在每次绘制Frame结束后都会回调,我们可以利用它做一些帧率检测。

  1. WidgetsBinding.instance.addPersistentFrameCallback((_){
  2. print("Frame has been rendered");
  3. });

小结

- 调用次数 是否支持setState
构造函数 1
initState 1 无效(使用setState和不使用一样)
didChangeDependencies >=1 无效
didUpdateWidget >=1 无效
deactivate >=1
dispose 1

App生命周期

监听App 的生命周期,例如 Flutter 是在前台还是在后台,需要使用WidgetsBindingObserver

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注