FLutter开发--浅谈生命周期

作为一名移动端开发工程师,刚接触 Flutter 的时候,一定会有这样的疑问:Flutter 的生命周期是怎么样的?是如何处理生命周期的?相对于iOS的ViewController(),Andriod的onCreate()在哪里呢? 我的业务逻辑应该放在哪里处理?初始化数据呢?接下来我们一起来探讨吧。


iOS

如果你是一名 iOS 开发工程师,那么对于 UIViewController 的生命周期肯定不陌生

  • viewDidLoad
  • viewWillAppear
  • viewDidAppear
  • viewWillDisappear
  • viewDidDisappear
  • dealloc
- (instancetype)init{
    if (self = [super init]) {
        NSLog(@"1.init初始化");
    }
    return self;
}
//当时xib加载时
- (void)awakeFromNib{
    [super awakeFromNib];
    NSLog(@"2.Nib加载成功");
}
- (void)loadView{
    [super loadView];
    NSLog(@"3.加载view。");
}
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"4.载入完成,可以进行自定义数据以及动态创建其他控件");
}
- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    NSLog(@"5.视图将出现在屏幕之前");
}
- (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    NSLog(@"6.将要对子视图进行调整");
}
- (void)viewDidLayoutSubviews{
    [super viewDidLayoutSubviews];
    NSLog(@"7.对子视图进行调整完毕");
}
- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    NSLog(@"8.视图已在屏幕上渲染完成");
}
- (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    NSLog(@"9.视图将被从屏幕上移除");
}
- (void)viewDidDisappear:(BOOL)animated{
    [super viewDidDisappear:animated];
    NSLog(@"10.视图已经被从屏幕上移除");
}
- (void)dealloc{
    NSLog(@"11.视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放");
}
- (void)didReceiveMemoryWarning{
    [super didReceiveMemoryWarning];
    NSLog(@"12.内存警告");
}
UIViewController生命周期

Android

如果你是一名Android开发工程师,那么对于Activity 生命周期肯定也很了解了

/*1、在activity被创建时回调,第一个生命周期;
我们一般在创建activity时重写该方法做一些初始化操作,
如通过setcontentview()设置页面布局的资源,初始化所需要的组件信息等*/
@Override
    protected void onCreate() {
        super.onCreate();
        setContentView(R.layout.main); 
        Log.e(TAG, "创建activity时调用");
    }

/*2、该方法回调表示activity正在启动,此时Activity处于可见状态。
只是还没有在前台显示,因此用户也无法交互。
可以简单理解为Activity已显示却无法被用户看见。*/
    @Override
    protected void onStart() {
        super.onStart();
        Log.e(TAG, "当activity界面变为用户可见时调用");
    }

/*Activity已经在屏幕上显示UI并允许用户操作了。*/
    @Override
    protected void onResume() {
        super.onResume();
        Log.e(TAG, "当activity界面获得焦点时调用");
    }

/* 处于正在停止的一个临界点 */
    @Override
    protected void onPause() {
        super.onPause();
        Log.e(TAG, "当activity界面失去焦点");
    }

/* 表示Activity即将停止,可以做一些相对重量级的回收工作 */
    @Override
    protected void onStop() {
        super.onStop();
        Log.e(TAG, "当activity变为不可见时调用");
    }

/* 表示Activity即将被被销毁,这是Activity生命的尽头 */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e(TAG, "当activity被销毁时调用");
    }

/* 表示Activity重新启动 */
    @Override
    protected void onRestart() {
        super.onRestart();
       Log.e(TAG, "当activity再次启动时调用");
    }
Activity生命周期.png

Flutter

知道了 Android 和 iOS 的生命周期,那么 Flutter 呢?有和移动端对应的生命周期函数么?如果之前你对 Flutter 有一点点了解的话,你会发现 Flutter 中有两个主要的 Widget:StatelessWidget(无状态)StatefulWidget(有状态)。无状态组件生命周期只有 build 这个过程,所以我们主要来介绍下 StatefulWidget生命周期,因为它有着和 Android 和 iOS 相似的生命周期。

  • createState:该函数为 StatefulWidget 中创建 State 的方法,当 StatefulWidget 被创建时会立即执行 createState。createState 函数执行完毕后表示当前组件已经在 Widget 树中,此时有一个非常重要的属性 mounted 被置为 true。
  • initState:该函数为 State 初始化调用,只会被调用一次,因此,通常会在该回调中做一些一次性的操作,如执行 State 各变量的初始赋值、订阅子树的事件通知、与服务端交互,获取服务端数据后调用 setState 来设置 State。
  • didChangeDependencies:该函数是在该组件依赖的 State 发生变化时会被调用。这里说的 State 为全局 State,例如系统语言 Locale 或者应用主题等,Flutter 框架会通知 widget 调用此回调。该方法调用后,组件的状态变为 dirty,立即调用 build 方法。
  • build:主要是返回需要渲染的 Widget,由于 build 会被调用多次,因此在该函数中只能做返回 Widget 相关逻辑,避免因为执行多次而导致状态异常。
  • reassemble:主要在开发阶段使用,在 debug 模式下,每次热重载都会调用该函数,因此在 debug 阶段可以在此期间增加一些 debug 代码,来检查代码问题。此回调在 release 模式下永远不会被调用。
  • didUpdateWidget:该函数主要是在组件重新构建,比如说热重载,父组件发生 build 的情况下,子组件该方法才会被调用,其次该方法调用之后一定会再调用本组件中的 build 方法。
  • deactivate:在组件被移除节点后会被调用,如果该组件被移除节点,然后未被插入到其他节点时,则会继续调用 dispose 永久移除。
  • dispose:永久移除组件,并释放组件资源。调用完 dispose 后,mounted 属性被设置为 false,也代表组件生命周期的结束。
不是生命周期但是却非常重要的几个概念

下面这些并不是生命周期的一部分,但是在生命周期中起到了很重要的作用。

  • mounted:是 State 中的一个重要属性,相当于一个标识,用来表示当前组件是否在树中。在 createState 后 initState 前,mounted 会被置为 true,表示当前组件已经在树中。调用 dispose 时,mounted 被置为 false,表示当前组件不在树中。所以在setState之前,最好判断一下mounted是否为true。
  • dirty:表示当前组件为脏状态,下一帧时将会执行 build 函数,调用 setState 方法或者执行 didUpdateWidget 方法后,组件的状态为 dirty。
  • clean:与 dirty 相对应,clean 表示组件当前的状态为干净状态,clean 状态下组件不会执行 build 函数。
Flutter生命周期流程图
大致分为三个阶段
  1. 初始化阶段(插入渲染树),包括两个生命周期函数 createState 、initState、didChangeDependencies 和 build
  2. 状态改变阶段(在渲染树中存在),这个阶段有可能是因为 didChangeDependencies、 setState 或者 didUpdateWidget 而引发的组件重新 build ,在组件运行过程中会多次触发,这也是优化过程中需要着重注意的点;
  3. 组件销毁阶段(从渲染树中移除),deactivate 和 dispose。

Tips:lxx_app_demo代码演示

参考文档:
https://www.cnblogs.com/xjy-123/p/5271063.html
https://blog.csdn.net/qq_35559358/article/details/79715222
https://juejin.cn/post/7056646298073563166

你可能感兴趣的:(FLutter开发--浅谈生命周期)