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();
}
相关推荐
祈澈菇凉16 分钟前
什么是 Vue 的自定义事件?如何触发和监听?
前端·javascript·vue.js
2301_766536052 小时前
调试无痛入手
开发语言·前端
@大迁世界3 小时前
构建 Next.js 应用时的安全保障与风险防范措施
开发语言·前端·javascript·安全·ecmascript
IT、木易4 小时前
ES6 新特性,优势和用法?
前端·ecmascript·es6
计算机软件程序设计4 小时前
vue和微信小程序处理markdown格式数据
前端·vue.js·微信小程序
指尖时光.4 小时前
【前端进阶】01 重识HTML,掌握页面基本结构和加载过程
前端·html
前端御书房4 小时前
Pinia 3.0 正式发布:全面拥抱 Vue 3 生态,升级指南与实战教程
前端·javascript·vue.js
NoneCoder4 小时前
JavaScript系列(84)--前端工程化概述
前端·javascript·状态模式
晚安7205 小时前
idea添加web工程
java·前端·intellij-idea
零凌林6 小时前
vue3中解决组件间 css 层级问题最佳实践(Teleport的使用)
前端·css·vue.js·新特性·vue3.0·teleport