State 的生命周期,定义了 Widget 的加载到构建的全过程,能够利用其回调机制根据 Widget 的状态选择合适的时机作合适的事情。而 APP 的生命周期,则定义了 APP 从启动到退出的全过程ide
若是想在对应的 APP 的生命周期事件中作相应的处理,好比 APP 从后台进入前台、从前台退到后台,或是在 UI 绘制完后作一些处理,则能够应用 WidgetsBindingObserver 类来实现this
// Accessibility 相关特性回调 void didChangeAccessibilityFeatures() { } // App 生命周期改变回调 void didChangeAppLifecycleState(AppLifecycleState state) { } // 本地化语言改变回调 void didChangeLocales(List<Locale> locale) { } // 系统窗口相关改变回调 void didChangeMetrics() { } // 系统亮度改变回调 void didChangePlatformBrightness() { } // 文本缩放系数改变回调 void didChangeTextScaleFactor() { } // 内存不足警告回调 void didHaveMemoryPressure() { } // 页面 pop Future<bool> didPopRoute() => Future<bool>.value(false); // 页面 push Future<bool> didPushRoute(String route) => Future<bool>.value(false);
要使用以上回调方法,只需经过给 WidgetsBindingObserver 单例对象设置监听器便可监听相关回调方法线程
didChangeAppLifecycleState 回调方法中,有一个参数类型为 AppLifecycleState 的枚举类,这个枚举类是 Flutter 对 App 生命周期状态的封装,经常使用的状态包括 inactive、paused、resumedcode
class AppLifecycleReactor extends StatefulWidget { const AppLifecycleReactor({ Key key }) : super(key: key); @override _AppLifecycleReactorState createState() => _AppLifecycleReactorState(); } class _AppLifecycleReactorState extends State<AppLifecycleReactor> with WidgetsBindingObserver { @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this);// 注册监听器 } @override void dispose() { WidgetsBinding.instance.removeObserver(this);// 移除监听器 super.dispose(); } AppLifecycleState _notification; @override void didChangeAppLifecycleState(AppLifecycleState state) { print("$state"); } }
能够试着切换下先后台,观察下控制台输出的 App 状态orm
有时除了须要监听 App 的生命周期回调外,还须要在组件完成渲染后作一些与显示相关的其余处理,好比切换线程等,此时能够使用 WidgetsBinding 来实现server
WidgetsBinding 提供了单次 Frame 绘制回调及实时 Frame 绘制回调两种机制对象
WidgetsBindingObserver.instance.addPostFrameCallback((_){ print("addPostFrameCallback 绘制回调"); // 只回调一次 });
WidgetsBindingObserver.instance.addPersistentFrameCallback((_){ print("addPersistentFrameCallback 绘制回调"); // 每帧都回调 });