当前位置:   article > 正文

Flutter的生命周期_statefulwidget 回到前台

statefulwidget 回到前台

生命周期是一个从创建到销毁的过程,Flutter生命周期分为两部分:

1.Widget的生命周期

2.APP的生命周期

我们先看Widget的生命周期

 

一、Widget的生命周期

1.StatelessWidget
对于StatelessWidget来说,生命周期只有build过程。build是用来创建Widget的,在每次页面刷新时会调用build。

2.StatefulWidget
StatefulWidget的生命周期依次为:

initState:当Widget第一次插入到Widget树时会被调用,对于每一个State对象,这个方法只会调用一次。所以,通常在该回调中做一些一次性的操作,如一些初始化操作。(注意:不能在该回调中调用BuildContext.inheritFromWidgetOfExactType(该方法用于在Widget树上获取离当前widget最近的一个父级InheritFromWidget),原因是在初始化完成后,Widget树中的InheritFromWidget也可能会发生变化,所以正确的做法应该在在build()方法或didChangeDependencies()中调用它。)

didChangeDependencies():当State对象的依赖发生变化时会被调用;

这个方法在两种情况下会调用:
情况一:调用initState会调用;
情况二:从其他对象中依赖一些数据发生改变时,比如前面我们提到的InheritedWidget;

build:它主要是用于构建Widget子树

reassemble:此回调是专门为了开发调试而提供的,在热重载(hot reload)时会被调用,此回调在Release模式下永远不会被调用。

didUpdateWidget:在widget重新构建时,Flutter framework会调用Widget.canUpdate来检测Widget树中同一位置的新旧节点,然后决定是否需要更新,如果Widget.canUpdate返回true则会调用此回调。正如之前所述,Widget.canUpdate会在新旧widget的key和runtimeType同时相等时会返回true,也就是说在在新旧widget的key和runtimeType同时相等时didUpdateWidget()就会被调用。

deactivate:当State对象从树中被移除时,会调用此回调。在一些场景下,Flutter framework会将State对象重新插到树中,如包含此State对象的子树在树的一个位置移动到另一个位置时(可以通过GlobalKey来实现)。如果移除后没有重新插入到树中则紧接着会调用dispose()方法。

dispose:当State对象从树中被永久移除时调用;通常在此回调中释放资源。

生命周期图如下

 

示例如下

  1. class Life extends StatefulWidget {
  2. @override
  3. _TestLifeState createState() => _TestLifeState();
  4. }
  5. class _TestLifeState extends State<Life> with WidgetsBindingObserver {
  6. String title = "点击父组件";
  7. @override
  8. void initState() {
  9. // TODO: implement initState
  10. super.initState();
  11. print('page1--initState');
  12. WidgetsBinding.instance.addObserver(this);
  13. }
  14. @override
  15. void didChangeAppLifecycleState(AppLifecycleState state) {
  16. print(state.toString());
  17. }
  18. @override
  19. void didChangeDependencies() {
  20. print('test-page1--didChangeDependencies');
  21. super.didChangeDependencies();
  22. }
  23. @override
  24. void didUpdateWidget(Life oldWidget) {
  25. print('test-page1--didUpdateWidget');
  26. super.didUpdateWidget(oldWidget);
  27. }
  28. @override
  29. Widget build(BuildContext context) {
  30. print('test-page1--build');
  31. return Scaffold(
  32. appBar: AppBar(
  33. // Here we take the value from the MyHomePage object that was created by
  34. // the App.build method, and use it to set our appbar title.
  35. title: Text("生命周期示例"),
  36. ),
  37. body: Column(
  38. children: <Widget>[
  39. GestureDetector(
  40. child: new Text(title ?? ""),
  41. onTap: () {
  42. setState(() {
  43. title = "父组件变化了";
  44. });
  45. },
  46. ),
  47. Container(
  48. width: 100,
  49. height: 50,
  50. child: Column (children: [
  51. ],),
  52. ),
  53. ChildStatefulWidget(),
  54. FlatButton(
  55. color: Colors.grey,
  56. onPressed: () {
  57. Navigator.of(context)
  58. .push(new MaterialPageRoute(builder: (BuildContext c) {
  59. return new TestLifeCyclePage2();
  60. }));
  61. },
  62. child: Text("跳转页面")),
  63. ],
  64. ),
  65. );
  66. }
  67. @override
  68. void reassemble() {
  69. // TODO: implement reassemble
  70. super.reassemble();
  71. print('test-page1--reassemble');
  72. }
  73. @override
  74. void deactivate() {
  75. // TODO: implement deactivate
  76. super.deactivate();
  77. print('test-page1--deactivate');
  78. }
  79. @override
  80. void dispose() {
  81. // TODO: implement dispose
  82. super.dispose();
  83. //WidgetsBinding.instance.addObserver(this);
  84. print('test-page1--dispose');
  85. }
  86. }
  1. class ChildStatefulWidget extends StatefulWidget {
  2. @override
  3. _ChildStatefulWidgetState createState() {
  4. print("child--createState");
  5. return _ChildStatefulWidgetState();
  6. }
  7. }
  8. class _ChildStatefulWidgetState extends State<ChildStatefulWidget> {
  9. String title = "点击子组件";
  10. @override
  11. Widget build(BuildContext context) {
  12. print('child--build');
  13. return GestureDetector(
  14. child: new Text(title ?? ""),
  15. onTap: () {
  16. setState(() {
  17. title = "子组件变化了";
  18. });
  19. },
  20. );
  21. }
  22. @override
  23. void initState() {
  24. print('child--initState');
  25. super.initState();
  26. }
  27. @override
  28. void didChangeDependencies() {
  29. print('child--didChangeDependencies');
  30. super.didChangeDependencies();
  31. }
  32. @override
  33. void didUpdateWidget(ChildStatefulWidget oldWidget) {
  34. print('child--didUpdateWidget');
  35. super.didUpdateWidget(oldWidget);
  36. }
  37. @override
  38. void reassemble() {
  39. print('child--reassemble');
  40. super.reassemble();
  41. }
  42. @override
  43. void deactivate() {
  44. print('child--deactivate');
  45. super.deactivate();
  46. }
  47. @override
  48. void dispose() {
  49. print('child--dispose');
  50. super.dispose();
  51. //WidgetsBinding.instance.addObserver(this);
  52. }
  53. }
  1. class TestLifeCyclePage2 extends StatefulWidget {
  2. @override
  3. _Test2LifeCyclePageState createState(){
  4. return new _Test2LifeCyclePageState();
  5. }
  6. @override
  7. StatefulElement createElement() {
  8. // TODO: implement createElement
  9. // print("page2--createElement");
  10. return super.createElement();
  11. }
  12. }
  13. class _Test2LifeCyclePageState extends State<TestLifeCyclePage2> with WidgetsBindingObserver {
  14. @override
  15. void initState() {
  16. // TODO: implement initState
  17. super.initState();
  18. print('test-page2---initState');
  19. WidgetsBinding.instance.addObserver(this);
  20. }
  21. @override
  22. void didChangeAppLifecycleState(AppLifecycleState state) {
  23. print(state.toString());
  24. }
  25. @override
  26. void didChangeDependencies() {
  27. // TODO: implement didChangeDependencies
  28. super.didChangeDependencies();
  29. print('test-page2---didChangeDependencies');
  30. }
  31. @override
  32. void didUpdateWidget(TestLifeCyclePage2 oldWidget) {
  33. // TODO: implement didUpdateWidget
  34. super.didUpdateWidget(oldWidget);
  35. print('test-page2---didUpdateWidget');
  36. }
  37. @override
  38. Widget build(BuildContext context) {
  39. print('page2---build');
  40. // TODO: implement build
  41. return Scaffold(
  42. appBar: AppBar(
  43. // Here we take the value from the MyHomePage object that was created by
  44. // the App.build method, and use it to set our appbar title.
  45. title: Text("生命周期示例2"),
  46. ),
  47. );
  48. }
  49. @override
  50. void reassemble() {
  51. // TODO: implement reassemble
  52. super.reassemble();
  53. print('test-page2---reassemble');
  54. }
  55. @override
  56. void deactivate() {
  57. // TODO: implement deactivate
  58. super.deactivate();
  59. print('test-page2---deactivate');
  60. }
  61. @override
  62. void dispose() {
  63. // TODO: implement dispose
  64. super.dispose();
  65. //WidgetsBinding.instance.addObserver(this);
  66. print('test-page2---dispose');
  67. }
  68. }

进入page1 生命周期
 

点击父组件setState的生命周期

点击子组件的生命周期

进入page2 的生命周期

退出page2 的生命周期

点击热重载按钮的生命周期

二、 App的生命周期

App的生命周期需要通过WidgetsBindingObserver的didChangeAppLifecycleState来获取,在initState中添加监听WidgetsBinding.instance.addObserver(this);

resumed:可见并能响应用户的输入
inactive:处在并不活动状态,无法处理用户响应
paused:不可见并不能响应用户的输入,但是在后台继续活动


app从前台退到后台的生命周期

app 从后台回到前台的生命周期

退出app的生命周期

 

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

闽ICP备14008679号