Flutter-widget声明周期

82 阅读2分钟

Flutter页面周期

StatelessWidget只有createElement、与build两个生命周期 StatefulWidget的生命周期方法按照时期不同可以分为三组:

进入页面会加载:initState、didChangeDependencies、build

初始化时期

createState:

当我们构建一个StatefulWidget时,这个会立即调用,这个方法必须被覆盖

initState:

这是创建widget时调用的除构造方法外的第一个方法: 类似于Android的:onCreate()与iOS的viewDidLoad()在这个方法中通常做一些初始化的工作,比如channel的初始化,监听器的初始化等

更新时期:

didChangeDependencies

当依赖的State对象改变时会调用

  1. 在第一次构建widget时,在initState()之后立即调用此方法
  2. 如果的StatefulWidget依赖于InheritedWidget,那么当当前State所依赖InheritedWidget中的变量改变时会再次调用它

拓展:InheritedWidget可以高效的将数据在widget树中向下传递、共享

build

这是一个必须实现的方法,在这里实现你要呈现的页面内容 它会在didChangeDependencies()之后立即调用;另外当调用setState后也会再次调用该方法

didUpdateWidget

这是一个不常用到的生命周期方法,当父组件需要重绘时会调用 该方法会携带一个oldWidget参数,可以将其与当前的widget进行对比以便执行一些额外的逻辑 if (oldWidget.xxx != widget.xxx)

销毁期:

deactivate

很少使用,在组件被移除时调用在dispose之前调用

dispose

常用:组件被销毁时调用 通常在该方法中执行一些资源的释放工作比如,监听器的卸载,channel的销毁等

Flutter应用的周期

如何获取Flutter应用的周期 WidgetsBindingObsever:是一个Widgets绑定观察器,通过它我们可以监听应用的生命周期、语言

class AppLifecyle extends StatefulWidget {
    @overirde
    _AppLifecycleState createState() => _AppLifecycleState()
}
class _AppLifecycleState extends State<AppLifecycle> with WidgetsBindingObsever {
    @overirde
    Widget build(BuildContext context){
        WidgetBinding.instance.addObsever(this)
    }
    @overirde
    void didChangeSppLifecycleState(AppLifecycleState state<img src="){" alt="" width="100%" />
        super.didChangeSppLifecycleState(state)
        print("state = $state")
        if (state == AppLifecycleState.paused){
            print("App进入后台")
        }else if (state == AppLifecycleState.resumed){
             print("App进入前台")
        }else if (state == AppLifecycleState.inactive){
             // 不常用:应用程序处于非活动状态,并且未接收用户输入时调用,比如:来了个电话
        }else if (state == AppLifecycleState.suspending){
             //不常用:应用程序被挂起时调用,它不会在iOS上触发
        }
    }
    @override
    void dispose(){
        WidgetsBinding.instance.removeObsever(this)
        super.dispose()
    }
}