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

news/2024/7/20 22:39:40 标签: flutter, android, ios, 前端

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

  • 参考链接: 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();
}



http://www.niftyadmin.cn/n/5463226.html

相关文章

【R语言从0到精通】-1-下载R语言与R最基础内容

在本科&#xff0c;没有人教的情况下&#xff0c;艰难的自学了R语言&#xff0c;因此我想能出一个R语言系列教程&#xff0c;在帮助大家的同时&#xff0c;温故而知新&#xff0c;特别如果你是生物或者医学从业者&#xff0c;那本教程正好合适&#xff0c;因为我也是生物人&…

spring系列常用注解原理

1、EnableFeignClients /***启动类中使用EnableFeignClients注解&#xff0c;程序启动时会扫描当前包及其子包下所有的FeignClient注解的接口 并给这些接口创建动态代理类对象. 调用代理类的方法的时候.利用反射的机制,可以拿到当前的对象所有的接口&#xff0c;可以获取到接口…

CentOS换yum源

备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup或 mv /etc/yum/repos.d/CentOS-Base.repo{,.date -I}下载新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.co…

Java中级工程师面试题

1. Java中的集合框架有哪些主要组件&#xff1f; 答案&#xff1a; Java集合框架主要包括接口、实现类和迭代器。主要接口有Collection、List、Set、Queue和Map。实现类包括ArrayList、LinkedList、HashSet、LinkedHashSet、TreeSet、PriorityQueue、HashMap、LinkedHashMap和…

vue+ts 第八章(认识watchEffect高级侦听器)

watchEffect 立即执行传入的一个函数&#xff0c;同时响应式追踪其依赖&#xff0c;并在其依赖变更时重新运行该函数。 如果用到message 就只会监听message 就是用到几个监听几个 而且是非惰性 会默认调用一次 let message ref<string>() let message2 ref<string…

力扣 1143. 最长公共子序列

题目来源&#xff1a;https://leetcode.cn/problems/longest-common-subsequence/description/ C题解&#xff08;思路来源代码随想录&#xff09;&#xff1a;动态规划。 1. 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j]&#xff1a;长度为[0, i - 1]…

python面试题(51~60)

51. 举一个递推式构造字典&#xff08;dictionary comprehension&#xff09;的例子。 import string list(string.ascii_lowercase) alphabet list(string.ascii_lowercase) comprehensiond {val:idx for idx,val in enumerate(alphabet)} print(comprehensiond)#> {a: …

Sublime Text4 4169 安装激活【亲测可用】

此教程用于Windows 下Sublime Text4 4169版本的安装和激活。 无需安装其他软件&#xff0c;无需下载替换文件&#xff0c;无需注册机等。 官网&#xff1a; https://www.sublimetext.com 下载地址 64位&#xff1a;https://download.sublimetext.com/sublime_text_build_41…