文章阅读
flutter使用ldd_systen_listen来监听键盘和扫码枪的原始数据(Rawinput)
2025/12/16101 次阅读7 分钟
1.安装
将依赖添加进你的项目
dart pub add ldd_systen_listen
pub地址: https://pub.dev/packages/ldd_system_listen
源码: https://github.com/mdddj/ldd_system_listen
2.初始化Libaray
await initLddSystenListen();必须要await
Future<void> main() async {
await initLddSystenListen();// 添加这行
runApp(const MyApp());
}
3.创建键盘设备管理器
所有的api都基于这个类,统领全局操作,只能初始化一次,不能用作全局静态使用,不能在文件顶端进行创建
final manager = LddKeyboardManager(printDebug: true, gunAddEndReturnKey: true); //键盘管理器
参数说明:
printDebug: 是否在控制台打印debug日志
gunAddEndReturnKey: 在扫码枪类型的扫描数据回调中添加return键
4.设置键盘类型的输入设备监听(重要API)
备注: 它会返回你电脑接入的所有键盘类型的设备列表,hid, 主要用它来区分传统键盘和扫码枪键盘
// 返回接入的所有键盘输入设备,包括传统键盘+扫码枪键盘
List<LddKeyboard> keyboards = manager.getLddKeyboardList();
LddKeyboard 对象包含了你的设备唯一id,它很关键,主要用它来区分数据是扫码枪还是键盘
建议: 需要做一个设置功能,可以叫做《绑定扫码枪》列出上面的设备列表,然后保存这个对象,标识它为扫码枪类型,它在后面一步非常重
5.监听键盘或者扫码枪数据 (重要API)
这个函数会在程序中开一个线程,来监听你的输入事件,它没有性能损耗,几乎完美实现
StreamSubscription<LddRawEvent> stream = manager
.listenLddKeyboardEvent(gunDevice: keyboards.first)
.listen(onKeyboardListen);
它可以传入一个参数叫gunDevice,需要传入一个扫码枪类型的设备,它在上一步的api中获得,我这里为了方便直接传第一个
onKeyboardListen函数会回调监听到的按键,如果传了gunDevice,会回调扫码枪扫描事件
///监听原始键盘事件
void onKeyboardListen(LddRawEvent event) {
event.printInfo();
}
我这里为了方便直接打印。
6. 不用了记得销毁监听和释放内存,像这样
@override
void dispose() {
//销毁监听
stream?.cancel();
//释放内存
manager.dispose();
super.dispose();
}
7.其他
来看看回调的按键对象有哪些(LddRawEvent)
这是回调的定义
它有两种类型的回调 1.传统键盘回调 2.扫码枪键盘回调
@freezed
sealed class LddRawEvent with _$LddRawEvent {
const LddRawEvent._();
const factory LddRawEvent.lddKeyboardEvent(
BigInt field0,
LddKeyId field1,
LddState field2,
LddKeyboard field3,
) = LddRawEvent_LddKeyboardEvent;
const factory LddRawEvent.scanGunEvent(
List<LddKeyId> field0,
LddKeyboard field1,
) = LddRawEvent_ScanGunEvent;
}
属性说明(传统):
field0: 设备的下标,也就是getLddKeyboardList()函数返回列表的下标,可以用来标识触发的设备
field1: 键盘按下的键,是个枚举
field2: 它有两种状态,一个按下,一个松开
field3: 触发的键盘设备对象
属性说明(扫码枪):
field0: 扫描到的数据列表
field1: 触发扫码枪的设备对象
然后看看打印的扩展函数,像这样使用
void printInfo() {
when(
lddKeyboardEvent: (field0, field1, field2, field3) {
print("普通键盘事件:${field1.keyIdToString()},类型:${field2.formatString()}");
},
scanGunEvent: (field0, field1) {
print("扫码枪事件:${field0.map((item) => item.keyIdToString())}");
},
);
}
完整的代码
main.dart
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:ldd_system_listen/api/entitys.dart';
import 'package:ldd_system_listen/api/multiinput.dart';
import 'package:ldd_system_listen/ldd_system_listen.dart';
Future<void> main() async {
await initLddSystenListen();
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final manager =
LddKeyboardManager(printDebug: true, gunAddEndReturnKey: true); //初始化键盘管理器
List<LddKeyboard> keyboards = []; //电脑连接的设备列表
StreamSubscription<LddRawEvent>? stream; //监听键盘事件流
@override
void initState() {
super.initState();
Future.microtask(init);
}
///初始化键盘管理器
void init() {
manager.register(); //注册键盘监听事件
keyboards = manager.getLddKeyboardList(); //获取键盘设备列表,包括传统键盘,扫码枪等特殊键盘
setState(() {}); //刷新ui
stream ??= manager
.listenLddKeyboardEvent(gunDevice: keyboards.first)
.listen(onKeyboardListen);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text("键盘测试"),
),
body: SingleChildScrollView(
child: Column(
children: [
if (keyboards.isEmpty) const Text('没有检测到键盘设备'),
...keyboards.map((item) {
return Card(
child: ListTile(
title: Text(item.name),
subtitle: Text(item.serial ?? "-"),
),
);
})
],
),
),
),
);
}
///监听原始键盘事件
void onKeyboardListen(LddRawEvent event) {
event.printInfo();
}
@override
void dispose() {
//销毁监听
stream?.cancel();
//释放内存
manager.dispose();
super.dispose();
}
}