通过 WidgetsBindingObserver 实现监听软键盘的弹出关闭
实现 WidgetsBindingObserver
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
class _State extends State<MyPage> with WidgetsBindingObserver { @override void initState() { super.initState(); // 初始化 WidgetsBinding.instance.addObserver(this); } @override void dispose() { // 销毁 WidgetsBinding.instance.removeObserver(this); super.dispose(); } // 监听 @override void didChangeMetrics() { super.didChangeMetrics(); WidgetsBinding.instance.addPostFrameCallback((_) { if(mounted){ if(0 == MediaQuery.viewInsetsOf(context).bottom) { // 关闭键盘 } else { // 显示键盘 } } }); } } |
注意:
如果使用 Scaffold 作为父组件,在使用 MediaQuery.viewInsetsOf(context).bottom 获取键盘高度如果无论如何都是 0 。
此时有两种方案:
1. 需设置父级 Scaffold 的 resizeToAvoidBottomInset 为 false 。
1 2 3 4 5 6 7 8 |
Scaffold( // 子组件若需要监听键盘高度,需设置为false resizeToAvoidBottomInset:false, appBar: AppBar( title: '页面title', ), body: ContentPage(),//子页面中监听键盘高度 ), |
但是这样设置之后,会导致键盘弹出的时候,Scaffold 不会自动向上移动,导致输入范围被遮挡。
2. 使用 Scaffold 上层/同层的 BuildContext 作为参数传递给子 View ,然后传递给 MediaQuery 作为参数。