一些流程示意图

image.png

image.png

image.png

生命周期的解释

  • 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 的生命周期

  1. import 'package:flutter/material.dart';
  2. class LifecycleAppPage extends StatefulWidget {
  3. @override
  4. State<StatefulWidget> createState() {
  5. return new _LifecycleAppPageState('构造函数');
  6. }
  7. }
  8. class _LifecycleAppPageState extends State<LifecycleAppPage>
  9. with WidgetsBindingObserver {
  10. String str;
  11. int count = 0;
  12. _LifecycleAppPageState(this.str);
  13. @override
  14. void initState() {
  15. print(str);
  16. print('initState');
  17. super.initState();
  18. WidgetsBinding.instance.addObserver(this);
  19. }
  20. @override
  21. void didChangeDependencies() {
  22. print('didChangeDependencies');
  23. super.didChangeDependencies();
  24. }
  25. @override
  26. void didUpdateWidget(LifecycleAppPage oldWidget) {
  27. print('didUpdateWidget');
  28. super.didUpdateWidget(oldWidget);
  29. }
  30. @override
  31. void deactivate() {
  32. print('deactivate');
  33. super.deactivate();
  34. }
  35. @override
  36. void dispose() {
  37. print('dispose');
  38. WidgetsBinding.instance.removeObserver(this);
  39. super.dispose();
  40. }
  41. @override
  42. void didChangeAppLifecycleState(AppLifecycleState state) {
  43. switch (state) {
  44. case AppLifecycleState.inactive:
  45. print('AppLifecycleState.inactive');
  46. break;
  47. case AppLifecycleState.paused:
  48. print('AppLifecycleState.paused');
  49. break;
  50. case AppLifecycleState.resumed:
  51. print('AppLifecycleState.resumed');
  52. break;
  53. case AppLifecycleState.suspending:
  54. print('AppLifecycleState.suspending');
  55. break;
  56. }
  57. super.didChangeAppLifecycleState(state);
  58. }
  59. @override
  60. Widget build(BuildContext context) {
  61. print('build');
  62. return new Scaffold(
  63. appBar: new AppBar(
  64. title: new Text('lifecycle 学习'),
  65. centerTitle: true,
  66. ),
  67. body: new OrientationBuilder(
  68. builder: (context, orientation) {
  69. return new Center(
  70. child: new Text(
  71. '当前计数值:$count',
  72. style: new TextStyle(
  73. color: orientation == Orientation.portrait
  74. ? Colors.blue
  75. : Colors.red),
  76. ),
  77. );
  78. },
  79. ),
  80. floatingActionButton: new FloatingActionButton(
  81. child: new Text('click'),
  82. onPressed: () {
  83. count++;
  84. setState(() {});
  85. }),
  86. );
  87. }
  88. }
  89. class LifecyclePage extends StatelessWidget {
  90. @override
  91. Widget build(BuildContext context) {
  92. // TODO: implement build
  93. return new Scaffold(
  94. body: new LifecycleAppPage(),
  95. );
  96. }
  97. }

学习资料