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();
}
相关推荐
亚里士多没有德7752 分钟前
强制删除了windows自带的edge浏览器,重装不了怎么办【已解决】
前端·edge
helloxmg4 分钟前
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
flutter
micro2010146 分钟前
Microsoft Edge 离线安装包制作或获取方法和下载地址分享
前端·edge
.生产的驴10 分钟前
Electron Vue框架环境搭建 Vue3环境搭建
java·前端·vue.js·spring boot·后端·electron·ecmascript
awonw13 分钟前
[前端][easyui]easyui select 默认值
前端·javascript·easyui
小雨cc5566ru24 分钟前
uniapp+Android智慧居家养老服务平台 0fjae微信小程序
android·微信小程序·uni-app
九圣残炎34 分钟前
【Vue】vue-admin-template项目搭建
前端·vue.js·arcgis
柏箱1 小时前
使用JavaScript写一个网页端的四则运算器
前端·javascript·css
TU^1 小时前
C语言习题~day16
c语言·前端·算法