使用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
相关产品推荐
相关产品推荐

