文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Flutter生命周期超详细讲解

2023-01-29 09:00

关注

一、组件生命周期

flutter组件只有两种:有状态和无状态组件。由于无状态组件效率高,如果不涉及到组件内部的数据存储,尽量多的使用无状态组件

1、StatelessWidget

build:组件渲染

调用次数:1次

StatelessWidget是无状态组件,生命周期只有一个build方法,很简单

2、StatefulWidget

flutter生命周期大体上可以分为三个阶段:初始化、状态变化、销毁。

2.1、初始化阶段

constructor:构造方法

调用次数:1次

createState:创建状态

调用次数:1次

在创建一个新的StatefulWidget,会首先调用这个方法, 这个生命周期是必须有的。

class LifeScreen extends StatefulWidget {
  LifeScreen({Key key}) : super(key: key);
  @override
  _LifeScreenState createState() => _LifeScreenState();
}

initState:初始化状态

调用次数:1次

这个生命周期是在该节点创建后调用的第一个方法。插入渲染树时调用,只调用一次,widget创建执行的第一个方法,这里可以做一些初始化工作,比如初始化State的变量。

2.2、状态变化阶段

mounted:是否在正常状态中

只是一个值,不是方法

所有的节点都会有这个属性,在buildContext被赋值并且该节点已经在节点树(the widget tree)上的时候,这个属性的值会变成true。然后该属性会一直保持true,直到dispose的方法被调用后会变成false.

addPostFrameCallback:渲染后回调

这个需要在initState() 内被调用,示例如下:

import 'package:flutter/scheduler.dart';
@override
void initState() {
  super.initState();
  SchedulerBinding.instance.addPostFrameCallback((_) => {});
}

这个是在每一帧渲染完成后的回调,只有在该节点构建(build)完成后调用一次。

didChangeDependencies:父级结构中的层级变化

调用次数:多次

build:组件渲染

调用次数:多次

didUpdateWidget:组件更新

调用次数:多次

组件状态改变时候调用

2.3、销毁阶段

deactivate:节点移除

当State对象从树中被移除时,会调用此回调,会在dispose之前调用。

页面销毁的时候会依次执行:deactivate > dispose

dispose:节点销毁

调用次数:1次

在deactivate()之后调用,当State对象从树中被永久移除时调用;通常在此回调中释放资源。

在这个生命周期里需要取消订阅(unsubscribe) streams和回收动画(dispose animations)等等,避免内存泄漏。

reassemble

调用次数:多次

在热重载(hot reload)时会被调用,此回调在Release模式下永远不会被调用。

原因是

开发阶段:JIT (Just-in-Time,即时编译),使用了jvm。

打包使用:AOT (Ahead-of-Time,预编译),使用so库直接运行。

二、App生命周期

通过WidgetsBindingObserver的didChangeAppLifecycleState 来获取。通过该接口可以获取是生命周期在AppLifecycleState类中。

示例:

class LoginTestPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _LoginTestPageState();
  }
}
class _LoginTestPageState extends State<LoginTestPage>
    with WidgetsBindingObserver {
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
  }
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) async {
    print("--" + state.toString());
    switch (state) {
      case AppLifecycleState.inactive: // 处于这种状态的应用程序应该假设它们可能在任何时候暂停。
        break;
      case AppLifecycleState.resumed:
        {} // 应用程序可见,前台
        break;
      case AppLifecycleState.paused: // 应用程序不可见,后台
        break;
      case AppLifecycleState.detached:
        // TODO: Handle this case.
        break;
    }
  }
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Container();
  }
}

resumed

可见并能响应用户的输入,同安卓的onResume

inactive

处在并不活动状态,无法处理用户响应,同安卓的onPause

paused

不可见并不能响应用户的输入,但是在后台继续活动中,同安卓的onStop

App常见生命周期切换

初次打开widget时,不执行AppLifecycleState的回调;

按home键或Power键, AppLifecycleState inactive---->AppLifecycleState pause

从后台到前台:AppLifecycleState inactive—>ApplifecycleState resumed

back键退出应用: AppLifecycleState inactive—>AppLifecycleState paused

到此这篇关于Flutter生命周期超详细讲解的文章就介绍到这了,更多相关Flutter生命周期内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯