Flutter的组件渲染方式参考了RN的渲染方式,经过虚拟Dom和diff计算来达到性能的优化。在Flutter中左右的东西都是有Widget组成,这里咱们不讨论简单的StalessWidgtet,由于其使用和渲染都很简单,主要以有实际意义的StafulWidget为探讨对象。与RN的渲染同样,能够将Flutter组件渲染分红三个阶段less
初始化的时候会依次调用initState->didChangedDependencies->build方法。函数
initState是在构造函数以后调用的,整个组件的生命周期阶段只会调用一次,值得注意的是在咱们更新组件的时候,组件是会从新建立的,但State在销毁以前一直都是同一个,而且从新绑定到新的组件上,在里面咱们能够初始化一些全局要用到的东西。性能
didChangedDependencies方法会在initState后调用,在这方法回调里,咱们可使用InheritedWidget获取父级传递共享的资源。整个生命周期didChangedDependencies会调用屡次,至少1次,而且在某些更新阶段也会调用。优化
更新分为两种更新:ui
一种是组件自己或者其父组件调用setState触发的更新,这种更新走的生命周期是:didUpdateWidget->build。对象
这没什么说的,咱们能够在didUpdateWidget从新绑定一些组件的监听或者重置状态。生命周期
另外一种是依赖的InheritedWidget发生变化的时候,会触发didChangedDependencies。ci
销毁阶段,主要执行的方法有两个:deactivate->dispose。资源
deactivate方法标志组件为无效状态,紧跟着会进入dispose,开发
dispose是组件彻底销毁时回调,主要在里面作一些移除监听的操做
简单了解生命周期还不够,要知道咱们有多个页面时生命周期是如何运做的这对咱们开发来很重要。
假设有两个页面A、B,当咱们新打开页面时,初始化阶段很简单
A:initState -> didChangedDependences ->build
这时候,咱们开启新的B页面:
B:initState -> didChangedDependences ->build
A:deactivate->build
你没有看错,咱们B页面初始化阶段结束后,A页面会进入不可用状态,并从新build(但不会绘制),A页面不会卸载。
最后,咱们从B页面按返回键返回A页面:
A:deactivate->build
B:deactivate->dispose
此时A页面进入运行状态,B页面移除