WidgetsBindingObserver 这个类提供的回调函数非常丰富,常见的屏幕旋转、屏幕亮度、语言变化、内存警告都可以通过这个实现进行回调。
直接看下源码
abstract class WidgetsBindingObserver {
//页面pop
Future<bool> didPopRoute() => Future<bool>.value(false);
//页面push
Future<bool> didPushRoute(String route) => Future<bool>.value(false);
//系统窗口相关改变回调,如旋转
void didChangeMetrics() { }
//文本缩放系数变化
void didChangeTextScaleFactor() { }
//系统亮度变化
void didChangePlatformBrightness() { }
//本地化语言变化
void didChangeLocales(List<Locale> locale) { }
//App生命周期变化
void didChangeAppLifecycleState(AppLifecycleState state) { }
//内存警告回调
void didHaveMemoryPressure() { }
//Accessibility相关特性回调
void didChangeAccessibilityFeatures() { }
}
只需要在主 State 添加此接口,在 State 对象被插入视图树的时候注册监听器,在State 对象被销毁的时候移除监听器
///State 的生命周期:创建(插入视图树)、更新(在视图树中存在)、销毁(从视图树中移除)。
class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this); //注册监听器
}
@override
void dispose() {
super.dispose();
WidgetsBinding.instance.removeObserver(this); //移除监听器
}
}
比如复写 didChangeAppLifecycleState 函数,可以监听 App 生命周期的变化。
//App生命周期变化
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
}
与 Android 生命周期部分相似:
resumed:可见的,并能响应用户的输入。
inactive:处在不活动状态,无法处理用户响应。
paused:不可见并不能响应用户的输入,但是在后台继续活动中。
从后台切入前台:
{msg=didChangeAppLifecycleState : AppLifecycleState.resumed}
Home 从前台退回后台:
{msg=didChangeAppLifecycleState : AppLifecycleState.inactive}
{msg=didChangeAppLifecycleState : AppLifecycleState.paused}
Back 退出
msg=didChangeAppLifecycleState : AppLifecycleState.inactive