You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FocusManager关闭键盘后,如何等待收起再执行后续操作?

等待键盘完全收起后执行后续操作的实现方法

在Flutter中,调用FocusManager.instance.primaryFocus?.unfocus()只是触发键盘收起动作,但键盘收起是带系统动画的异步过程,直接紧跟后续操作会因键盘未完全收起导致布局或逻辑异常。可以通过监听MediaQuery的视图内边距变化来判断键盘是否完全收起,具体实现如下:

核心实现代码

// 触发键盘收起
FocusManager.instance.primaryFocus?.unfocus();

// 监听键盘收起完成状态
WidgetsBinding.instance.addPostFrameCallback((_) {
  final initialBottomInset = MediaQuery.of(context).viewInsets.bottom;
  
  // 键盘本来就是收起状态,直接执行后续逻辑
  if (initialBottomInset == 0) {
    _executeAfterKeyboardClosed();
    return;
  }

  // 添加持续帧回调,监听视图内边距变化
  final frameCallback = WidgetsBinding.instance.addPersistentFrameCallback((_) {
    final currentBottomInset = MediaQuery.of(context).viewInsets.bottom;
    if (currentBottomInset == 0) {
      // 键盘完全收起,移除监听并执行后续操作
      WidgetsBinding.instance.removePersistentFrameCallback(frameCallback);
      _executeAfterKeyboardClosed();
    }
  });
});

// 封装后续要执行的逻辑
void _executeAfterKeyboardClosed() {
  // 这里写键盘收起后需要执行的代码,比如页面跳转、状态更新、动画触发等
}

原理说明

键盘的显示/收起会直接反映在MediaQuery.of(context).viewInsets.bottom的值上:

  • 键盘显示时,该值为键盘高度(大于0)
  • 键盘完全收起时,该值变为0

通过addPersistentFrameCallback持续监听这个值的变化,当它变为0时,即可确定键盘动画已结束,此时执行后续操作就不会出现异常。

内容的提问来源于stack exchange,提问作者Flutter Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:15:39