Flutter State 的生命周期

Flutter 中主要有两种 Widget:StatelessWidgetStatefulWidget。本文重点放在 StatefulWidget,因为它有点像 AndroidiOS 中的某些概念。

StatefulWidget


StatefulWidget 是最重要的 Widget,因为它持有 State,它知道何时发生变化并进行必要的重绘。它的生命周期如下:

  • createState

  • initState

  • didChangeDependencies

  • build

  • (didUpdateWidget)

— — — — — — — — — — —

  • deactivate

  • dispose

你可能会注意到创建阶段的 state 比销毁阶段的多,这是因为创建/重建 Widget 及其 State 更复杂。

createState():

构建新的 StatefulWidget 时将调用 createState(),StatefulWidget 的子类必须覆盖这个方法:

class MyScreen extends StatefulWidget {

@override

_MyScreenState createState() => _MyScreenState();

}

initState()

通常需要重写这个方法。它是 Widget 创建后调用的第一个方法,可以理解成 onCreate()viewDidLoad() 的等价物。在这个方法中可以检查 Widget 某些相关属性:是否有被渲染?当前是否处理 mounted 状态?

mounted

每个 Widget 都有这个属性。当为 Widget.buildContext 赋值后 mounted 的值变成 true,Widget 在树中。直到 dispose 方法被调用前,mounted 一直为 true。

addPostFrameCallback

可以在 initState 方法中按如下方式调用 addPostFrameCallback

import ‘package:flutter/scheduler.dart’;

@override

void initState() {

super.initState();

SchedulerBinding.instance.addPostFrameCallback((_) => {});

}

这个方法为一帧结束时添加回调,回调方法只会调用一次,通知 Widget 构建已完成。

didChangeDependencies

widget 构建时第一次调用 initState() 后立即会调用 didChangeDependencies()。如果 StatefulWidgets 依赖某个 InheritedWidget,后者发生变化时会导致 didChangeDependencies() 再次被调用。

build()

可以肯定地说这是最重要的方法。这个方法依赖整个待渲染的 Widget 树,在 didChangeDependencies() 立即被调用。所有的 GUI 渲染发生在这个方法,每次 UI 需要重新渲染时都会调用这个方法。(重新渲染是很廉价的操作)

didUpdateWidget()

这是一个不太常见的生命周期方法。一旦 parent widget 有变化需要重绘 UI 时会调用 didUpdateWidget()。这个方法有一个 oldWidget 参数,可以将它跟当前 widget 进行比较以执行某些额外的业务逻辑。

deactivate()

这个生命周期方法也不太常见。这个方法被调用时,意味着 Widget 开始进入”死亡”阶段。

当 framework 从树中移除 State 时会调用本方法。某些情况下,framework 会重新将 State 对象加入到树中。

dispose()

这个方法也非常重要。当 Widget 及其 State 从树中永久移除时会调用这个方法。此后 Widget 不会再被构建。

你需要在这个方法中做取消对 stream 的监听、销毁动画等操作。它是 initState 的反操作。

WidgetsBindingObserver

=================================================================================

如果我们想监听应用何时进入后台该怎么办?

可以这样做。对 StatefulWidget 做些小改动:

class _MyScreenState extends State with WidgetsBindingObserver

我们让 _MyScreenState 实现了抽象类 WidgetsBindingObserver,之后就可以观察应用的生命周期状态。在 initState 方法中开始观察:

WidgetsBinding.instance.addObserver(this);

dispose 方法中停止观察:

WidgetsBinding.instance.removeObserver(this);

接下来在 didChangeAppLifecycleState 接收生命周期的变化即可:

@override

void didChangeAppLifecycleState(AppLifecycleState state) {

super.didChangeAppLifecycleState(state);

if (state == AppLifecycleState.paused) {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

由于题目很多整理答案的工作量太大,所以仅限于提供知识点,详细的很多问题和参考答案我都整理成了 PDF文件

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

理成了 PDF文件

[外链图片转存中…(img-NpaqQpAW-1713308475606)]

[外链图片转存中…(img-tiZBpdFG-1713308475607)]

[外链图片转存中…(img-kjJy0IWr-1713308475609)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值