和尚使用 Flutter 这么长时间,并没有认真研究过 Flutter 的生命周期,今天和尚分几个场景学习一下 Flutter 的生命周期;
和尚借助 WidgetsBinding 通过观察和监听 didChangeAppLifecycleState 来分析生命周期事件,与 Android 原生类似;
initState -> didChangeDependencies -> build
和尚尝试页面按钮点击或弹框处理,均不会涉及生命周期变化,只是在 build 更新 Widget 资源;但是若进行 热重载 生命周期如下:
reassemble -> didUpdateWidget -> build
didUpdateWidget -> build -> didUpdateWidget -> build (执行两次)
didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState(AppLifecycleState.paused) -> build
didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState(AppLifecycleState.resumed) -> build
deactivate -> dispose
新页面initState -> didChangeDependencies -> build -> 旧页面deactivate -> didChangeDependencies -> build (新页面初始化+旧页面置于后台)
旧/新页面didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState(AppLifecycleState.paused) -> build
旧/新页面didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState(AppLifecycleState.resumed) -> build
旧页面deactivate -> build(AppLifecycleState.resumed) -> 新页面deactivate -> dispose
和尚也尝试了一下 Android7.0 分屏情况下的生命周期;
didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState(AppLifecycleState.paused) -> build (与切至后台相同)
didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState(AppLifecycleState.resumed) -> didChangeAppLifecycleState(AppLifecycleState.inactive) -> build
didChangeAppLifecycleState(AppLifecycleState.resumed) -> build
与 Android 不同,调整屏幕大小不会进行生命周期变化,前提是当前应用已获取焦点,若未获取焦点,则会在调整屏幕大小为全屏时进行获取焦点的生命周期方法;
生命周期非常重要也非常有趣,值得我们多多尝试和研究,和尚仅尝试了几种常见的情况,如有错误请多多指导!
来源:阿策小和尚