在开发flutter的项目中,不可避免的要和设备的键盘打交道,Android系统的还好,iOS设备的键盘有时候是不是就会给你来点“惊喜”。
最有效的方法就是在你的textfield组件里混入WidgetsBindingObserver类,在该类的展开方法里处理键盘展开和收回的相关逻辑。
class YourTextFieldState extends State<YourTextFieldState> with WidgetsBindingObserver {
@override
void initState() {
super.initState();
/// 初始化
WidgetsBinding.instance.addObserver(this);
}
@override
void didChangeMetrics() {
super.didChangeMetrics();
WidgetsBinding.instance.addPostFrameCallback((_) {
setState(() {
if(MediaQuery.of(context).viewInsets.bottom==0){
/// 键盘收回
}else{
/// 键盘弹出
}
});
});
}
@override
void dispose() {
/// 销毁
super.dispose();
WidgetsBinding.instance.removeObserver(this);
}
}
如果遇到你的输入组件是一个类似定时器的东西,有可能每倒计时1秒,你的当前组件所在的页面就要重新render一次,针对iOS的设备来说有可能会关闭不了软键盘。这时候可以在键盘收回的逻辑里,让该组件失去焦点,添加如下代码即可:
focusNode.unfocus();
focusNode是你当前组件类里FocusNode实例化对象,或者添加全局代码:
FocusScope.of(context).requestFocus(FocusNode());
以上内容修改完成后多测试,希望对你有所帮助~