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

二、屏蔽系统键盘
怎样才能够在输入框获取焦点的时候,不让系统键盘弹出呢?同时又显示我们自定义的键盘呢?
- 这里就需要自定义
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();
}