WidgetsBindingObserver 介绍
abstract class WidgetsBindingObserver {
/// 当使用Navigator返回到上一个页面时 true为拦截,false不拦截
Future<bool> didPopRoute() => Future<bool>.value(false);
/// 当使用Navigator跳转到下一个页面时 true为拦截,false不拦截
Future<bool> didPushRoute(String route) => Future<bool>.value(false);
///当push一个新页面或者恢复路由时的回调
Future<bool> didPushRouteInformation(RouteInformation routeInformation) {
return didPushRoute(routeInformation.location!);
}
///应用尺寸改变时回调,例如旋转,键盘谈起
void didChangeMetrics() { }
/// 当 textScaleFactor大小改变时候回调
void didChangeTextScaleFactor() { }
/// 当平台的brightness发生改变时候的回调
void didChangePlatformBrightness() { }
///当App的locale 发生改变时候的回调
void didChangeLocales(List<Locale>? locales) { }
///当App进入后台或者从后台返回前台的回调
// resumed:应用可见并可响应用户操作
// inactive:用户可见,但不可响应用户操作
// paused:已经暂停了,用户不可见、不可操作
// suspending:应用被挂起,此状态IOS永远不会回调
void didChangeAppLifecycleState(AppLifecycleState state) { }
///低内存回调
void didHaveMemoryPressure() { }
///当系统更改当前活动的辅助功能集时调用。
void didChangeAccessibilityFeatures() { }
}
enum AppLifecycleState {
//应用可见并可响应用户操作
resumed,
//用户可见,但不可响应用户操作
inactive,
//已经暂停了,用户不可见、不可操作
paused,
//应用被挂起,此状态IOS永远不会回调
detached,
}
键盘监听代码
// viewInsets.bottom 就是键盘的高度
typedef ChangeMetricsCallback = void Function(EdgeInsets viewInsets);
class ChangeMetricsWidget extends StatefulWidget {
final Widget child;
final ChangeMetricsCallback? callback;
const ChangeMetricsWidget({Key? key, required this.child, this.callback})
: super(key: key);
@override
State<ChangeMetricsWidget> createState() => _ChangeMetricsWidgetState();
}
class _ChangeMetricsWidgetState extends State<ChangeMetricsWidget>
with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void didChangeMetrics() {
super.didChangeMetrics();
WidgetsBinding.instance.addPostFrameCallback((time) {
if (widget.callback != null) {
widget.callback!(MediaQuery.of(context).viewInsets);
}
});
}
@override
void dispose() {
super.dispose();
WidgetsBinding.instance.removeObserver(this);
}
@override
Widget build(BuildContext context) {
return widget.child;
}
}