与iOS的ViewController、Android的Activity一样,Flutter中的Widget也存在生命周期,并且通过State来提现。而App则是一个特殊的Widget,除了需要处理视图显示的各个阶段,还需要应对应用从启动到退出所经历的各个状态。
创新互联专业为企业提供顺城网站建设、顺城做网站、顺城网站设计、顺城网站制作等企业网站建设、网页设计与制作、顺城企业网站模板建站服务,10余年顺城做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
State的生命周期,指的是在用户参与的情况查下,其关联的Widget所经历的从创建到显示再到更新最后到停止,直至销毁的各个过程阶段。
这些不同的阶段涉及到的特定的任务处理,正确理解State的生命周期至关重要,State的生命周期流程图图,如下所示:
从图中可以看到,State的生命周期可以分为3个阶段:创建、更新、销毁。下面将介绍每一个阶段的具体流程
State初始化时会依次执行:构造方法 - initState - didChangeDependencies - build,随后完成页面渲染
Widget的状态更新,主要由3个方法触发:setState、didChangeDependencies与didUpdateWidget。
一旦这三个方法被调用,Flutter就回销毁旧的Widget,并调用build方法重建Widget
组件销毁相对比较简单,组件被移除,或者页面销毁的时候,系统会调用deactivate和dispose这两个方法来移除或销毁组件
下面这张表格也可以帮助我们理解记忆这些调用实际
视图的生命周期,定义了视图的加载到构建的全过程,其回调机制能够确保我们可以更具视图的状态选择合适的时间做恰当的事情,而App的生命周期,则定义了App从启动到退出的全过程
在原生Android、iOS开发中,有时我们需要再对应的App生命周期事件中做相应的处理,比如App从后台进入前台,从前台退出后台,或者在UI绘制完成后做一些处理。
这样的需求,在原生开发中,可以通过重写Activity、ViewController生命周期回调方法,或者是注册应用程序的相关通知来兼容App的生命周期并做相应的处理。而在Flutter中,我们可以利用WidgetsBindingObserver类,来实现同样的需求。
下面我们看看WidgetsBindingObserver中具体有哪些回调函数:
didChangeAppLifecycleState回调函数中,有一个参数类型为AppLifecycleState的枚举类型,这个枚举类型是Flutter对App生命周期状态的封装,它的常用状态包括:
可以将App切前后台,控制台输出的App状态,可以发现:
我们可以通过下面的这张图直观的了解状态切换过程
除了需要监听App的生命周期回调做相应处理外,根据不同的需求,我们需要再组件宣讲之后做一些与显示安全相关的操作,在iOS中,可以通过GCD的方法,让操作在下一个RunLoop执行,在Android中,可以通过View.post()插入消息队列,来保证在组件渲染后进行相关操作。在Flutter中实现同样的需求会更简单:使用WidgetsBinding来实现即可
WidgetsBinding提供了单词Frame绘制回调和实时Frame绘制回调两种机制来满足不同的需求场景:
转自
在 Flutter 中,有两类常用的 Widget:
在开发过程中,我们经常需要继承它们两来实现自己的 Widget。
一个 StatelessWidget 是不能被改变的,比如: Icon 、 Text 等。
如果你的控件一旦显示,就不需要再做任何的变更,那么你应该使用 StatelessWidget 。
实现一个自己的 StatelessWidget 很简单。
当你看到下面这个例子?时,你就知道它有多简单了。
看,只要在 build() 中返回你的视图就可以了。
一个 StatefulWidget 是有状态的,可变的。
它可以改变自己的外观,以响应用户的操作或者数据的变化。
比如: CheckBox 、 Switch ..
我们之所以能够改变一个 StatefulWidget ,是因为它有一个设置状态的函数:
调用这个函数后,就会触发 StatefulWidget 的视图树重建。
因此,当我们需要一个可交互的,即能根据用户操作或数据变化而改变视图的 Widget 时,那就得用上 StatelessWidget 了。
现在,来创建一个自定义的 StatefulWidget:
从上面的例子中可以看到, StatefulWidget 会要求提供一个含有视图树的 State 。
既然 State 能够控制一个视图的状态,那它肯定会有一系列的生命周期。
上图就是 State 的生命周期图。
在Widget销毁之前将WebView的监听和view销毁掉。
flutter生命周期大体上可以分为三个阶段:初始化、状态变化、销毁。
1、初始化阶段
对应执行构造方法和initState时候2、状态变化阶段
开新的widget或者调用setState方法的时候
3、销毁阶段
deactivate和dispose
二、生命周期阶段执行的函数
1、initState调用次数:1次
插入渲染树时调用,只调用一次,widget创建执行的第一个方法,这里可以做一些初始化工作,比如初始化State的变量。2、didChangeDependencies调用次数:多次
初始化时,在initState()之后立刻调用
当依赖的InheritedWidgetrebuild,会触发此接口被调用。实测在组件可见状态变化的时候会调用
3、build调用次数:多次初始化之后开始绘制界面。setState触发的时候会
4、didUpdateWidget调用次数:多次组件状态改变时候调用。
5、deactivate当State对象从树中被移除时,会调用此回调,会在dispose之前调用。页面销毁的时候会依次执行:deactivatedispose
6、dispose调用次数:1次当State对象从树中被永久移除时调用;通常在此回调中释放资源。
7、reassemble在热重载(hotreload)时会被调用,此回调在Release模式下永远不会被调用。
生命周期是一个从创建到销毁的过程,Flutter生命周期分为两部分:
1.Widget的生命周期
2.APP的生命周期
1.StatelessWidget
对于StatelessWidget来说,生命周期只有build过程。build是用来创建Widget的,在每次页面刷新时会调用build。
2.StatefulWidget
StatefulWidget的生命周期依次为:
createState是StatefulWidget来创建State的方法,只调用一次,
initState是StatefulWidget创建后调用的第一个方法,而且只执行一次。在执行initState时,View没有渲染,但是StatefulWidget 已经被加载到渲染树里了,这事的StatefulWidget的 mount 的值会变为true,知道dispose才会变为false.一般我们把初始化的一些操作都放在initState中。
didChangeDependencies会在initState后立即调用,之后只有当StatefulWidget依赖的InheritedWidget发生变化之后,didChangeDependencies才会调用,所以didChangeDependencies可以调用多次。
build方法会在didChangeDeoendencies之后立即调用,在之后setState()刷新时,会重新调用build绘制页面,所以build方法可以调用多次。但一般不再build中创建除创建Widget的方法,否则会影响渲染效率。
addPostFrameCallback是StatefulWidget渲染结束之后的回调,只会调用一次,一般是在initState里添加回调:,
一般在dispose中做一些取消监听、动画的操作,和initState相对使用。
AppLifecycleState就是App的生命周期,包含四个:
[img]didChangeAppLifecycleState App生命周期发生变化
AppLifecycleState.inactive - AppLifecycleState.paused
AppLifecycleState.inactive - AppLifecycleState.resumed - build
StatelessWidget 的生命周期只有一个,就是 build
build 是用来创建 Widget 的,但 因为 build 在每次界面刷新的时候都会调用,所以不要在 build 里写业务逻辑,可以把业务逻辑写到你的 StatelessWidget 的构造函数里 。
因此生命周期很简单
依次为
这个方法在一帧的最后调用,并且只调用一次,使用这个方法就可以在判断渲染完成,并获取到元素的大小。