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

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

  • 参考链接: https://juejin.cn/post/7166046328609308685
效果图

二、屏蔽系统键盘

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

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

  TextInputBinaryMessenger(this.origin);

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

  
  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);
  }

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

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

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

mixin TextInputBindingMixin on ServicesBinding {
  
  BinaryMessenger createBinaryMessenger() {
    return TextInputBinaryMessenger(super.createBinaryMessenger());
  }
}
  • 最后只需要在程序入口初始化即可:
 void main() {
  CustomWidgetsFlutterBinding.ensureInitialized();
  runApp();
}


相关推荐

  1. android 定义键盘显示和隐藏

    2024-03-30 10:10:02       38 阅读
  2. android 定义键盘长按弹窗

    2024-03-30 10:10:02       33 阅读
  3. Flutter——用户关闭键盘后强制拉起键盘

    2024-03-30 10:10:02       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-30 10:10:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-30 10:10:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-30 10:10:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-30 10:10:02       18 阅读

热门阅读

  1. 贪心,LeetCode 2952. 需要添加的硬币的最小数量

    2024-03-30 10:10:02       20 阅读
  2. 大型网站的容灾备份和高可用的详细技术和示例

    2024-03-30 10:10:02       18 阅读
  3. TCP的keepalive与HTTP的keep-alive的区别

    2024-03-30 10:10:02       19 阅读
  4. 实验十 枚举问题(过程模拟)

    2024-03-30 10:10:02       17 阅读
  5. YOLOv8参数详解

    2024-03-30 10:10:02       30 阅读
  6. sql中如何添加数据

    2024-03-30 10:10:02       19 阅读
  7. go中匿名函数的使用

    2024-03-30 10:10:02       21 阅读
  8. 如何解决EventSource 删除单词的前置空格问题

    2024-03-30 10:10:02       16 阅读
  9. 缺失的第一个正数 - LeetCode 热题 17

    2024-03-30 10:10:02       16 阅读