Flutter里怎么监听键盘弹起和收起事件?
我正在用Flutter做聊天页面,想在键盘弹出时自动滚动到底部,但不知道怎么监听页面键盘的显示和隐藏。网上看到有人说用MediaQuery,但我试了好像没反应。有没有类似React里那种onFocus或者键盘事件的监听方式?
比如在React里我这样处理输入框聚焦:
const handleFocus = () => {
inputRef.current?.scrollIntoView({ behavior: 'smooth' });
};
return (
<input ref={inputRef} onFocus={handleFocus} />
);
Flutter里有对应的方案吗?试过WidgetsBindingObserver但不太会用,求指点!
核心逻辑是这样的:让State实现WidgetsBindingObserver,然后在didChangeMetrics()里检测viewInsets变化。
几个容易踩的坑提醒一下:
第一,addPostFrameCallback这个是必须的,因为键盘弹起时界面还没完全渲染好,直接scroll会失败。
第二,viewInsets.bottom单位是逻辑像素,需要除以devicePixelRatio才是真实高度。
第三,build方法里给输入框容器加padding-bottom用的是MediaQuery.of(context).viewInsets.bottom,这个不需你手动计算,Flutter会自动处理好。
如果觉得这套写法麻烦,可以直接用flutter_keyboard_visibility这个包,一行代码搞定:
不过原理都是一样的,建议先把WidgetsBindingObserver这套弄明白,后面遇到其他系统事件监听也容易上手。