一些流程示意图

生命周期的解释
StatefulWidget.createState()
Framework 调用会通过调用 StatefulWidget.createState() 来创建一个 State。
initState()插入渲染树时调用,只调用一次,widget创建执行的第一个方法,可以再里面初始化一些数据,以及绑定控制器didChangeDependencies()
在 initState() 调用结束后,这个函数会被调用。事实上,当 State 对象的依赖关系发生变化时,这个函数总会被 Framework 调用。当State对象的依赖发生变化时会被调用;例如:在之前build() 中包含了一个InheritedWidget,然后在之后的build() 中InheritedWidget发生了变化,那么此时InheritedWidget的子widget的didChangeDependencies()回调都会被调用。InheritedWidget这个widget可以由父控件向子控件共享数据build()它主要是用于构建Widget子树的,调用次数:多次,初始化之后开始绘制界面,当setState触发的时候会再次被调用deactivate()
当 State 被暂时从视图树中移除时,会调用这个函数。页面切换时,也会调用它,因为此时 State 在视图树中的位置发生了变化,需要先暂时移除后添加。
重写的时候必须要调用 super.deactivate()。dispose()
当 State 被永久的从视图树中移除,Framework 会调用该函数。在销毁前触发,我们可以在这里进行最终的资源释放。在调用这个函数之前,总会先调用 deactivate()。注意,重写的时候必须要调用 super.dispose()。
didUpdateWidget(covariant T oldWidget)
当 widget 的配置发生变化时,会调用这个函数。比如,Hot-reload 的时候就会调用这个函数。这个函数调用后,会调用 build()。组件状态改变时候调用,可能会调用多次。
setState()
当我需要更新 State 的视图时,需要手动调用这个函数,它会触发 build() 。reassemble 此回调是专门为了开发调试而提供的,在热重载(hot reload)时会被调用,此回调在Release模式下永远不会被调用。
App 的生命周期
import 'package:flutter/material.dart';class LifecycleAppPage extends StatefulWidget { @override State<StatefulWidget> createState() { return new _LifecycleAppPageState('构造函数'); }}class _LifecycleAppPageState extends State<LifecycleAppPage> with WidgetsBindingObserver { String str; int count = 0; _LifecycleAppPageState(this.str); @override void initState() { print(str); print('initState'); super.initState(); WidgetsBinding.instance.addObserver(this); } @override void didChangeDependencies() { print('didChangeDependencies'); super.didChangeDependencies(); } @override void didUpdateWidget(LifecycleAppPage oldWidget) { print('didUpdateWidget'); super.didUpdateWidget(oldWidget); } @override void deactivate() { print('deactivate'); super.deactivate(); } @override void dispose() { print('dispose'); WidgetsBinding.instance.removeObserver(this); super.dispose(); } @override void didChangeAppLifecycleState(AppLifecycleState state) { switch (state) { case AppLifecycleState.inactive: print('AppLifecycleState.inactive'); break; case AppLifecycleState.paused: print('AppLifecycleState.paused'); break; case AppLifecycleState.resumed: print('AppLifecycleState.resumed'); break; case AppLifecycleState.suspending: print('AppLifecycleState.suspending'); break; } super.didChangeAppLifecycleState(state); } @override Widget build(BuildContext context) { print('build'); return new Scaffold( appBar: new AppBar( title: new Text('lifecycle 学习'), centerTitle: true, ), body: new OrientationBuilder( builder: (context, orientation) { return new Center( child: new Text( '当前计数值:$count', style: new TextStyle( color: orientation == Orientation.portrait ? Colors.blue : Colors.red), ), ); }, ), floatingActionButton: new FloatingActionButton( child: new Text('click'), onPressed: () { count++; setState(() {}); }), ); }}class LifecyclePage extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return new Scaffold( body: new LifecycleAppPage(), ); }}
学习资料