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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352

推荐阅读更多精彩内容