当前位置:   article > 正文

Flutter Widget 生命周期_flutter 到build多久

flutter 到build多久

Flutter  Widget什么周期主要讲解 StatefulWidget 的生命周期:应为无状态就两种;

  • StatelessWidget  两个生命周期
    1. @override
    2. StatelessElement createElement() => StatelessElement(this);
    3. @protected
    4. Widget build(BuildContext context);
 

StatefulWidget

StatefulWidget 生命周期按照 不同时期可以分为三组
 1.初始化:
         createState, initState
 2.更新时期
         didChangeDependencie,  build, didUpdateWidget
 3.销毁期
         deactivate, dispose

  1. createState  构造函数之前调用
  2. initState
    ◉ 创建 Widget 时 除了构造函数以外 第一个被调用的方法
    ◉ 类似 android: onCreate()  ios: viewDidLoad()
    ◉ 在这个方法中 一般会做一些初始化工作, 比如: channel的初始化; 监听器的初始化
  3. didChangeDependencies
    ◉ 当依赖的 State对象发生改变的时候  调用
     a. 在第一次构建 Widget时, 在initState() 之后会立即调用 此方法
     b. 如果StatefulWidget 依赖 InheritedWidget, 那么当前 State 所依赖的 
    ◉ InheritedWidget 中的变量改变时会再次调用 该方法
    ◉ 拓展:InheritedWidget 可以高效的将数据在 Widget 树中向下传递,共享 ;https://book.flutterchina.club/chapter7/inherited_widget.html
  4. build
    ◉ 这是一个必须实现的方法:在这里实现你要呈现的页面内容
    ◉ 它会在 didChangeDependencies() 之后体积调用
    ◉ 另外当调用 setState() 后也会再次调用 该方法
  5. didUpdateWidget
    ◉ 这是一个不常用的生命周期方法; 当父组件需要重新绘制的时候才会调用
    ◉ 该方法会携带一个 oldWidget, 可以将其与当前的 widget进行对比 以便更新一些额外的逻辑
    ◉ if( oldWidget.xx != widget.xxx) ...
  6. deactivate
    ◉ 很少使用,在组件被移除调用; 在 dispose 之前调用
  7. dispose
    ◉ 常用 在组件被销毁时 调用
    ◉ 通过在该方法中执行 一些资源释放工作 比如: 监听器的卸载, channel 的销毁
  1. I/flutter (21669): ------------>createState
  2. I/flutter (21669): ------------>initState
  3. I/flutter (21669): ------------>didChangeDependencies
  4. I/flutter (21669): ------------>build 第一次自己调用
  5. I/flutter (21669): ------------>build setState 引起的调用
  6. I/flutter (21669): ------------>build setState 引起的调用
  7. I/flutter (21669): ------------>deactivate
  8. I/flutter (21669): ------------>dispose

  1. import 'package:flutter/material.dart';
  2. class FlutterLife extends StatefulWidget {
  3. //createState 立即调用;必须重写
  4. @override
  5. State<StatefulWidget> createState() {
  6. print("------------>createState");
  7. return _FlutterLifeState();
  8. }
  9. }
  10. class _FlutterLifeState extends State<FlutterLife> {
  11. int clickCount = 0;
  12. ///创建 Widget 时 除了构造函数以外 第一个被调用的方法
  13. ///类似 android: onCreate() ios: viewDidLoad()
  14. ///在这个方法中 一般会做一些初始化工作, 比如: channel的初始化; 监听器的初始化
  15. @override
  16. void initState() {
  17. // TODO: implement initState
  18. super.initState();
  19. print("------------>initState");
  20. }
  21. ///当依赖的 State对象发生改变的时候 调用
  22. /// a. 在第一次构建 Widget时, 在initState() 之后会立即调用 此方法
  23. /// b. 如果StatefulWidget 依赖 InheritedWidget, 那么当前 State 所依赖的 InheritedWidget 中的变量改变时会再次调用 该方法
  24. /// 拓展:InheritedWidget 可以高效的将数据在 Widget 树中向下传递,共享 ;https://book.flutterchina.club/chapter7/inherited_widget.html
  25. @override
  26. void didChangeDependencies() {
  27. // TODO: implement didChangeDependencies
  28. super.didChangeDependencies();
  29. print("------------>didChangeDependencies");
  30. }
  31. /// 这是一个必须实现的方法:在这里实现你要呈现的页面内容
  32. /// 它会在 didChangeDependencies() 之后体积调用
  33. /// 另外当调用 setState() 后也会再次调用 该方法
  34. @override
  35. Widget build(BuildContext context) {
  36. print("------------>build");
  37. String title = (ModalRoute.of(context)!.settings.arguments as Map)['desc'];
  38. // TODO: implement build
  39. return Scaffold(
  40. appBar: AppBar(
  41. title: Text(title),
  42. ),
  43. body: Container(
  44. alignment: Alignment.center,
  45. child: Column(
  46. children: [
  47. Padding(
  48. padding: EdgeInsets.only(top: 28),
  49. child: Text('点击了:$clickCount'),
  50. ),
  51. Divider(
  52. height: 20,
  53. ),
  54. FlatButton(
  55. onPressed: () {
  56. setState(() {
  57. ++clickCount;
  58. });
  59. },
  60. child: Container(
  61. decoration: BoxDecoration(
  62. color: Colors.red,
  63. borderRadius: BorderRadius.circular(25),
  64. ),
  65. width: double.infinity,
  66. height: 50,
  67. child: Center(
  68. child: Text(
  69. '点击累计更新',
  70. style: TextStyle(
  71. color: Colors.white,
  72. fontWeight: FontWeight.bold,
  73. ),
  74. ),
  75. ),
  76. ),
  77. )
  78. ],
  79. ),
  80. ),
  81. );
  82. }
  83. /// 这是一个不常用的生命周期方法; 当父组件需要重新绘制的时候才会调用
  84. /// 该方法会携带一个 oldWidget, 可以将其与当前的 widget进行对比 以便更新一些额外的逻辑
  85. /// if( oldWidget.xx != widget.xxx) ...
  86. @override
  87. void didUpdateWidget(covariant FlutterLife oldWidget) {
  88. // TODO: implement didUpdateWidget
  89. super.didUpdateWidget(oldWidget);
  90. print("------------>didUpdateWidget");
  91. }
  92. /// 很少使用,在组件被移除调用; 在 dispose 之前调用
  93. @override
  94. void deactivate() {
  95. // TODO: implement deactivate
  96. super.deactivate();
  97. print("------------>deactivate");
  98. }
  99. /// 常用 在组件被销毁时 调用
  100. /// 通过在该方法中执行 一些资源释放工作 比如: 监听器的卸载, channel 的销毁
  101. @override
  102. void dispose() {
  103. // TODO: implement dispose
  104. super.dispose();
  105. print("------------>dispose");
  106. }
  107. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/308603?site
推荐阅读
相关标签
  

闽ICP备14008679号