Flutter 监听键盘弹起和收回事件

WidgetsBindingObserver 介绍

abstract class WidgetsBindingObserver {
   /// 当使用Navigator返回到上一个页面时 true为拦截,false不拦截
  Future didPopRoute() => Future.value(false);

   /// 当使用Navigator跳转到下一个页面时 true为拦截,false不拦截
  Future didPushRoute(String route) => Future.value(false);

 ///当push一个新页面或者恢复路由时的回调
  Future didPushRouteInformation(RouteInformation routeInformation) {
    return didPushRoute(routeInformation.location!);
  }
  ///应用尺寸改变时回调,例如旋转,键盘谈起
  void didChangeMetrics() { }

 /// 当 textScaleFactor大小改变时候回调
  void didChangeTextScaleFactor() { }

 /// 当平台的brightness发生改变时候的回调
  void didChangePlatformBrightness() { }

  ///当App的locale 发生改变时候的回调
  void didChangeLocales(List? 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 createState() => _ChangeMetricsWidgetState();
}

class _ChangeMetricsWidgetState extends State
    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;
  }
}

你可能感兴趣的:(Flutter 监听键盘弹起和收回事件)