Flutter连接物理扫码枪(物理键盘)时如何正常唤起软输入键盘
问题根源
当外接扫码枪时,系统会将扫码枪识别为物理键盘设备,默认会禁用软键盘来避免输入冲突。你之前的两个方案无效的原因如下:
SystemChannels.textInput.invokeMethod('TextInput.show')仅在当前有文本输入类组件持有焦点时才会生效,RawKeyboardListener绑定的是普通FocusNode,不属于文本输入节点,调用该方法不会触发软键盘弹出FocusScope.of(context).requestFocus(FocusNode())仅将焦点给到了无文本输入能力的空FocusNode,同样不会触发系统唤起软键盘
可行解决方案
方案1:使用隐藏TextField承接输入(最通用,推荐)
扫码枪的输入本质是快速的物理按键输入,完全可以被TextField承接,同时TextField自带文本输入焦点,可正常触发软键盘弹出:
你可以将TextField放置到屏幕可视区域外,或者设置为完全透明,代码示例:
Stack( children: [ // 你原来的页面布局 Positioned( left: -1000, top: 0, width: 100, height: 10, child: TextField( autofocus: true, controller: _barcodeController, onSubmitted: (value) { // 扫码枪输入完成会自动触发回车,对应onSubmitted回调 debugPrint('扫码结果:$value'); _barcodeController.clear(); // 处理完后重新请求焦点,等待下一次扫码 _barcodeController.requestFocus(); }, ), ), RawKeyboardListener( focusNode: _focusNode, onKey: (event) { // 保留你原来的扫码监听逻辑做双保险,或者直接去掉用TextField的逻辑即可 }, child: Container(), ) ], )
需要唤起软键盘时,直接调用对应可输入组件的requestFocus即可:
// 比如你有一个用户输入用的TextField,绑定了inputFocusNode FocusScope.of(context).requestFocus(inputFocusNode);
方案2:原生层强制开启软键盘(适用于需要同时保留RawKeyboardListener、且允许所有场景都显示软键盘的情况)
Android端修改
在对应FlutterActivity的onCreate方法中添加如下配置,强制系统即使连接物理键盘也可以弹出软键盘:
window.setFlags( WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM )
iOS端修改
在需要唤起软键盘的场景,强制显示虚拟键盘:
// 原生层添加调用逻辑 [[UIDevice currentDevice] setValue:@(YES) forKey:@"_softwareKeyboardPresented"];
方案3:动态切换焦点
在需要扫码时将焦点给到RawKeyboardListener的_focusNode,需要弹软键盘时主动unfocus该节点,再将焦点给到文本输入组件:
// 唤起软键盘前先取消RawKeyboardListener的焦点 _focusNode.unfocus(); // 再请求文本输入组件的焦点 FocusScope.of(context).requestFocus(inputTextFieldFocusNode);
内容的提问来源于stack exchange,提问作者Nikolay
相关产品推荐
相关产品推荐

