需求:按钮固定底部,键盘弹出,不能覆盖输入框,并且能滚动页面。
解决方法过程:
方案一:
resizeToAvoidBottomPadding: false, //输入框抵住键盘
结果:点击最底部输入框被键盘覆盖。
方案二:使用界面变化的观察者
WidgetsBinding.instance.addObserver(this)
@override
void didChangeMetrics() {
super.didChangeMetrics();
WidgetsBinding.instance.addPostFrameCallback((_) {
if (_focusNode.hasFocus) {
print('isKeyboardActived1${isKeyboardActived}');
if (isKeyboardActived) {
print('键盘收起$_key');
isKeyboardActived = false;
// 使输入框失去焦点
_focusNode.unfocus();
eventBus.fire(new InputStateEvent(''));
if (widget.onLostFocus != null) {
widget.onLostFocus();
}
return;
}
print('键盘弹起$_key');
if (widget.onFocus != null) {
widget.onFocus();
}
isKeyboardActived = true;
}
else {
if (isKeyboardActived) {
print('键盘收起$_key');
isKeyboardActived = false;
// 使输入框失去焦点
_focusNode.unfocus();
if (widget.onLostFocus != null) {
widget.onLostFocus();
}
}
}
});
}
结果:有个页面中对输入框存在其他操作,所以有两种输入框组件,每个输入框都写入这个方法。
使用这个出现的问题:
(1)、焦点从一个输入框组件到另一个输入框组件,再次切换回去,无法聚焦
(2)、快速在一个输入框进行失焦,聚焦,过段时间,输入框再也无法聚焦
(3)、ios中,didChangeMetrics,切换输入框就会调用一次。
方案三:使用flutter_keyboard_visibility控件,通过监听输入框隐藏显示按钮,
StreamSubscription _subscription;
_subscription = KeyboardVisibility.onChange.listen((bool visible) {
setState(() {
keyboardShow = visible;
});
if(visible){
if(hasFocus()){
if(widget.onFocus != null){
widget.onFocus();
}
}
}else{