当前位置: 首页 > news >正文

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 WidgetsFlutterBindingwith TextInputBindingMixin {///初始化static WidgetsBinding? ensureInitialized() {CustomWidgetsFlutterBinding();return WidgetsBinding.instance;}
}mixin TextInputBindingMixin on ServicesBinding {BinaryMessenger createBinaryMessenger() {return TextInputBinaryMessenger(super.createBinaryMessenger());}
}
  • 最后只需要在程序入口初始化即可:
 void main() {CustomWidgetsFlutterBinding.ensureInitialized();runApp();
}
http://www.lryc.cn/news/329610.html

相关文章:

  • 内存泄漏是什么?如何避免内存泄漏?
  • linux 中的syslog的含义和用法
  • kubernetes(K8S)学习(一):K8S集群搭建(1 master 2 worker)
  • 巧克力(蓝桥杯)
  • Python爬虫之pyquery和parsel的使用
  • 移动硬盘怎么加密?移动硬盘加密软件有哪些?
  • openEuler 22.03 安装 .NET 8.0
  • 【转载】OpenCV ECC图像对齐实现与代码演示(Python / C++源码)
  • 每日一题(相交链表 )
  • C#WPF控件大全
  • 好书推荐 《AIGC重塑金融》
  • 【Linux】权限理解
  • 插入排序、归并排序、堆排序和快速排序的稳定性分析
  • 【pytest、playwright】多账号同时操作
  • 软考 系统架构设计师系列知识点之云原生架构设计理论与实践(8)
  • 【C++】stack、queue和优先级队列
  • 第十三届蓝桥杯国赛真题 Java C 组【原卷】
  • docker部署ubuntu
  • iOS问题记录 - App Store审核新政策:隐私清单 SDK签名(持续更新)
  • ES学习日记(二)-------集群设置
  • 农村集中式生活污水分质处理及循环利用技术指南
  • linux 一些命令
  • 移动硬盘损坏打不开?别急,这里有解决方案!
  • 微信小程序【从入门到精通】——服务器的数据交互
  • Python爬虫-懂车帝城市销量榜单
  • 《QDebug 2024年3月》
  • C# OpenCvSharp-HoughCircles(霍夫圆检测) 简单计数
  • MybatisPlus速成
  • 【Django开发】0到1美多商城项目md教程第4篇:图形验证码,1. 图形验证码接口设计【附代码文档】
  • 八股 -- C#