跳到主内容
Flutter
文章阅读

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();
  }
}

返回顶部