最有效的方法,flutter监听键盘的弹出和收回

7,178 阅读1分钟

在开发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());

以上内容修改完成后多测试,希望对你有所帮助~