Flutter 拦截系统键盘,显示自定义键盘

一、这里记录下在开发过程中,下单的时候输入金额需要使用自定义的数字键盘

效果图

二、屏蔽系统键盘

怎样才能够在输入框获取焦点的时候,不让系统键盘弹出呢?同时又显示我们自定义的键盘呢?

  • 这里就需要自定义BinaryMessenger了 ,在这里拦截发送给系统显示键盘的消息这样就达到了不显示系统键盘的目的了
dart 复制代码
class TextInputBinaryMessenger extends BinaryMessenger {
  final BinaryMessenger origin;

  TextInputBinaryMessenger(this.origin);

  @override
  Future<void> handlePlatformMessage(
    String channel,
    ByteData? data,
    PlatformMessageResponseCallback? callback,
  ) {
    return origin.handlePlatformMessage(channel, data, callback);
  }

  @override
  Future<ByteData?>? send(String channel, ByteData? message) async {
    ///拦截系统键盘
    if (channel == SystemChannels.textInput.name) {
      final codec = SystemChannels.textInput.codec;
      final methodCall = codec.decodeMethodCall(message);
      if (methodCall.method == 'TextInput.show') {
        final FocusNode? focusNode = FocusManager.instance.primaryFocus;

        ///使用了这个[CustomKeyboardFocusNode] 统一不显示系统键盘
        if (focusNode is CustomKeyboardFocusNode) {
          return codec.encodeSuccessEnvelope(null);
        }
      }
    }
    return origin.send(channel, message);
  }

  @override
  void setMessageHandler(String channel, MessageHandler? handler) {
    origin.setMessageHandler(channel, handler);
  }
}
  • 这里有个小技巧,通过自定义一个FocusNode 这样在需要显示键盘的时候可以很轻松的判断当前需不需要显示系统的键盘。
  • 那现在就要做第二步了显示自己的键盘:也很简单只需要监听输入框的焦点的变化来显示和隐藏键盘即可。

三、最后怎么使用上面自定义好的TextInputBinaryMessenger呢?

  • 如下代码:
dart 复制代码
class CustomWidgetsFlutterBinding extends WidgetsFlutterBinding
    with TextInputBindingMixin {
  ///初始化
  static WidgetsBinding? ensureInitialized() {
    CustomWidgetsFlutterBinding();
    return WidgetsBinding.instance;
  }
}

mixin TextInputBindingMixin on ServicesBinding {
  @override
  BinaryMessenger createBinaryMessenger() {
    return TextInputBinaryMessenger(super.createBinaryMessenger());
  }
}
  • 最后只需要在程序入口初始化即可:
dart 复制代码
 void main() {
  CustomWidgetsFlutterBinding.ensureInitialized();
  runApp();
}
相关推荐
moxiaoran57531 小时前
uni-app萌宠案例学习笔记--页面布局和CSS样式设置
前端·css·uni-app
CrissChan2 小时前
Pycharm 函数注释
java·前端·pycharm
小小小小宇2 小时前
Vue.nextTick()笔记
前端
pop_xiaoli4 小时前
OC—UI学习-2
学习·ui·ios
小约翰仓鼠4 小时前
vue3子组件获取并修改父组件的值
前端·javascript·vue.js
Lin Hsüeh-ch'in4 小时前
Vue 学习路线图(从零到实战)
前端·vue.js·学习
烛阴4 小时前
bignumber.js深度解析:驾驭任意精度计算的终极武器
前端·javascript·后端
计蒙不吃鱼4 小时前
一篇文章实现Android图片拼接并保存至相册
android·java·前端
全职计算机毕业设计5 小时前
基于Java Web的校园失物招领平台设计与实现
java·开发语言·前端