实现扫码枪获取数据源,禁止系统键盘弹窗。依赖 EditableText
原理,实现 flutter 端扫码能力支持。
(不会触发键盘唤起,不会触发中文乱码)
在pubspec.yaml文件中进行引用:
dependencies:
scan_gun: ^2.0.0
在 main 方法中初始化 TextInputBinding
void main() {
TextInputBinding();
runApp(const MyApp());
}
提供 ScanMonitorWidget
作为父节点,嵌套使用:
ScanMonitorWidget({
Key? key,
required ChildBuilder childBuilder,
FocusNode? scanNode,
FocusNode? textFiledNode,
required void Function(String) onSubmit,
})
参数说明:
- childBuilder :
typedef ChildBuilder = Widget Function(BuildContext context)
,使用者自己UI作为子节点
- scanNode:
非必传,如果传,可通过 scanNode
监听获取当前扫码可用状态,hasFocus
时为获取焦点
- GlobalKey scanKey:
非必传,如果传,可通过 'scanKey' 强制获取获取焦点,保证扫码可用,如下
scanKey.currentState?.requestKeyboard()
- textFiledNode:
提供外部存在输入框键盘输入与扫码输入同时存在的场景。内部做了焦点切换能力,保证输入框焦点取消后,能马上切换成扫码枪的焦点
- focusLooper:
非必传,传true可开启轮询保活扫码焦点,但需要保证当前页面堆栈只存在一个 ScanMonitorWidget
- onSubmit:
接收扫码枪返回的结果
@override
Widget build(BuildContext context) {
return ScanMonitorWidget(
childBuilder: (context) {
return body();
},
onSubmit: (String result) {
print(result); //接收到扫码结果
},
);
}
FocusNode textFiledNode = FocusNode();
TextEditingController controller = TextEditingController();
Widget body() {
return TextField(
focusNode: textFiledNode,
controller: controller,
);
}
@override
Widget build(BuildContext context) {
return ScanMonitorWidget(
textFiledNode: textFiledNode,
childBuilder: (context) {
return body();
},
onSubmit: (String result) {
print(result); //接收到扫码结果
},
);
}