Flutter霍尼韦尔Captuvo设备集成插件flutter_honeywell_captuvo_plugin_nullsafe的使用

Flutter霍尼韦尔Captuvo设备集成插件flutter_honeywell_captuvo_plugin_nullsafe的使用

使用说明

重要:此插件基于@entegyopensourcehttps://github.com/entegyopensource/flutter_honeywell_captuvo_plugin 上发布的插件。
本仓库的目标是更新项目的文档,并使其能在Flutter应用中使用。

Flutter Honeywell Captuvo插件

这是一个用于Honeywell Captuvo SL22/42 iOS API的Flutter包装器,具有空安全特性。

使用方法

确保在ios/Info.plist文件中添加以下内容:

<key>UISupportedExternalAccessoryProtocols</key>
<array>
    <string>com.honeywell.scansled.protocol.decoder</string>
</array>

仅需在Dart文件中导入以下库:

import 'package:flutter_honeywell_captuvo_plugin/flutter_honeywell_captuvo_plugin.dart';

要开始使用SL22或SL42设备,必须调用以下函数启动它:

FlutterHoneywellCaptuvoPlugin.startDecoderHardware();

为了获取连接事件的通知,可以使用decoderConnectionStream,以下是一个完整的示例:

class _MyAppState extends State<MyApp> {
  StreamSubscription decoderConnectionStreamSubscription;

  [@override](/user/override)
  void initState() {
    super.initState();
    FlutterHoneywellCaptuvoPlugin.startDecoderHardware();
    decoderConnectionStreamSubscription = FlutterHoneywellCaptuvoPlugin
        .decoderConnectionStream
        .listen((isConnected) {
      if (isConnected) {
        FlutterHoneywellCaptuvoPlugin.startDecoderHardware();
      }
    });
  }

  [@override](/user/override)
  void dispose() {
    decoderConnectionStreamSubscription?.cancel();
    super.dispose();
  }
}

最后一步是获取条码扫描变化的通知:

class _MyAppState extends State<MyApp> {
  StreamSubscription decoderConnectionStreamSubscription;
  StreamSubscription decoderScanDataStreamSubscription;

  [@override](/user/override)
  void initState() {
    super.initState();
    FlutterHoneywellCaptuvoPlugin.startDecoderHardware();
    decoderConnectionStreamSubscription = FlutterHoneywellCaptuvoPlugin
        .decoderConnectionStream
        .listen((isConnected) {
      if (isConnected) {
        FlutterHoneywellCaptuvoPlugin.startDecoderHardware();
      }
    });

    decoderScanDataStreamSubscription = FlutterHoneywellCaptuvoPlugin
        .decoderScanDataStream
        .listen((barcode) {
      _showMyDialog("Barcode: " + barcode);
    });
  }

  [@override](/user/override)
  void dispose() {
    decoderConnectionStreamSubscription?.cancel();
    decoderScanDataStreamSubscription?.cancel();
    super.dispose();
  }

  Future<void> _showMyDialog(String message) async {
    return showDialog<void>(
      context: context,
      barrierDismissible: false, // 用户必须点击按钮!
      builder: (BuildContext context) {
        return AlertDialog(
          title: const Text('AlertDialog Title'),
          content: SingleChildScrollView(
            child: ListBody(
              children: <Widget>[
                Text(message),
              ],
            ),
          ),
          actions: <Widget>[
            TextButton(
              child: const Text('Approve'),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Captuvo SL42 API Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              StreamBuilder<bool>(
                stream: FlutterHoneywellCaptuvoPlugin.decoderConnectionStream,
                initialData: false,
                builder: (_, snapshot) => Text(
                    'Decoder is ${snapshot.data ? "Connected" : "Disconnected"}'),
              ),
              const SizedBox(height: 10.0),
              StreamBuilder<String>(
                stream: FlutterHoneywellCaptuvoPlugin.decoderScanDataStream,
                initialData: "NONE",
                builder: (_, snapshot) =>
                    Text('Last scan data: ${snapshot.data}'),
              ),
            ],
          ),
        ),
      ),
      floatingActionButton: GestureDetector(
        child: Container(
          height: 100.0,
          width: 100.0,
          decoration: BoxDecoration(
            color: Colors.blue,
            borderRadius: BorderRadius.circular(50.0),
          ),
          child: Icon(Icons.scanner),
        ),
        onTapDown: (_) => FlutterHoneywellCaptuvoPlugin.startDecoderScanning(),
        onTapUp: (_) => FlutterHoneywellCaptuvoPlugin.stopDecoderScanning(),
      ),
    );
  }
}

示例代码

以下是完整的示例代码,位于这里

import 'dart:async';

import 'package:flutter/material.dart';

import 'package:flutter_honeywell_captuvo_plugin_nullsafe/flutter_honeywell_captuvo_plugin_nullsafe.dart';

void main() => runApp(MaterialApp(home: MyApp()));

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  StreamSubscription decoderConnectionStreamSubscription;
  StreamSubscription decoderScanDataStreamSubscription;

  [@override](/user/override)
  void initState() {
    super.initState();
    FlutterHoneywellCaptuvoPlugin.startDecoderHardware();
    decoderConnectionStreamSubscription = FlutterHoneywellCaptuvoPlugin
        .decoderConnectionStream
        .listen((isConnected) {
      _showMyDialog("Connection event received changed");

      if (isConnected) {
        FlutterHoneywellCaptuvoPlugin.startDecoderHardware();
      }
    });

    decoderScanDataStreamSubscription =
        FlutterHoneywellCaptuvoPlugin.decoderScanDataStream.listen((barcode) {
      _showMyDialog("Barcode: " + barcode);
    });
  }

  [@override](/user/override)
  void dispose() {
    decoderConnectionStreamSubscription?.cancel();
    decoderScanDataStreamSubscription?.cancel();
    super.dispose();
  }

  Future<void> _showMyDialog(String message) async {
    return showDialog<void>(
      context: context,
      barrierDismissible: false, // 用户必须点击按钮!
      builder: (BuildContext context) {
        return AlertDialog(
          title: const Text('AlertDialog Title'),
          content: SingleChildScrollView(
            child: ListBody(
              children: <Widget>[
                Text(message),
              ],
            ),
          ),
          actions: <Widget>[
            TextButton(
              child: const Text('Approve'),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Captuvo SL42 API Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              StreamBuilder<bool>(
                stream: FlutterHoneywellCaptuvoPlugin.decoderConnectionStream,
                initialData: false,
                builder: (_, snapshot) => Text(
                    'Decoder is ${snapshot.data ? "Connected" : "Disconnected"}'),
              ),
              const SizedBox(height: 10.0),
              StreamBuilder<String>(
                stream: FlutterHoneywellCaptuvoPlugin.decoderScanDataStream,
                initialData: "NONE",
                builder: (_, snapshot) =>
                    Text('Last scan data: ${snapshot.data}'),
              ),
            ],
          ),
        ),
      ),
      floatingActionButton: GestureDetector(
        child: Container(
          height: 100.0,
          width: 100.0,
          decoration: BoxDecoration(
            color: Colors.blue,
            borderRadius: BorderRadius.circular(50.0),
          ),
          child: Icon(Icons.scanner),
        ),
        onTapDown: (_) => FlutterHoneywellCaptuvoPlugin.startDecoderScanning(),
        onTapUp: (_) => FlutterHoneywellCaptuvoPlugin.stopDecoderScanning(),
      ),
    );
  }
}

更多关于Flutter霍尼韦尔Captuvo设备集成插件flutter_honeywell_captuvo_plugin_nullsafe的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter霍尼韦尔Captuvo设备集成插件flutter_honeywell_captuvo_plugin_nullsafe的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成和使用flutter_honeywell_captuvo_plugin_nullsafe插件的一个代码示例。这个插件用于与霍尼韦尔Captuvo设备集成,提供对条形码扫描、磁条读取等功能的访问。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加flutter_honeywell_captuvo_plugin_nullsafe依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_honeywell_captuvo_plugin_nullsafe: ^最新版本号  # 请替换为实际可用的最新版本号

然后运行flutter pub get来安装依赖。

2. 导入插件

在你的Dart文件中导入插件:

import 'package:flutter_honeywell_captuvo_plugin_nullsafe/flutter_honeywell_captuvo_plugin_nullsafe.dart';

3. 初始化插件

在Flutter应用的适当位置(如initState或某个服务初始化方法中)初始化插件:

class _MyHomePageState extends State<MyHomePage> {
  late FlutterHoneywellCaptuvoPlugin _captuvoPlugin;

  @override
  void initState() {
    super.initState();
    _captuvoPlugin = FlutterHoneywellCaptuvoPlugin();

    // 监听扫描事件
    _captuvoPlugin.onScanDataReceived.listen((scanData) {
      print('Scan Data Received: $scanData');
      // 在这里处理扫描数据
    });

    // 初始化Captuvo设备(如果需要)
    _initializeCaptuvoDevice();
  }

  Future<void> _initializeCaptuvoDevice() async {
    try {
      await _captuvoPlugin.initialize();
      print('Captuvo Device Initialized');
    } catch (e) {
      print('Failed to Initialize Captuvo Device: $e');
    }
  }

  @override
  void dispose() {
    _captuvoPlugin.dispose();
    super.dispose();
  }

  // ... 其他UI代码和逻辑
}

4. 使用插件功能

扫描条形码/二维码

插件已经通过事件监听的方式自动处理了扫描事件,如上例中的_captuvoPlugin.onScanDataReceived.listen

读取磁条数据

如果需要读取磁条数据,可以使用以下方法:

Future<void> _readMagneticStripe() async {
    try {
      String? magneticStripeData = await _captuvoPlugin.readMagneticStripe();
      print('Magnetic Stripe Data: $magneticStripeData');
      // 在这里处理磁条数据
    } catch (e) {
      print('Failed to Read Magnetic Stripe: $e');
    }
  }

配置Captuvo设备

插件可能提供了一些配置方法,你可以根据需求调用这些方法。例如,设置扫描器的蜂鸣声:

Future<void> _configureBeepSound() async {
    try {
      await _captuvoPlugin.setBeepEnabled(true);  // 启用蜂鸣声
      print('Beep Sound Enabled');
    } catch (e) {
      print('Failed to Configure Beep Sound: $e');
    }
  }

5. 完整示例

以下是一个完整的示例,展示了如何在Flutter应用中集成并使用flutter_honeywell_captuvo_plugin_nullsafe插件:

import 'package:flutter/material.dart';
import 'package:flutter_honeywell_captuvo_plugin_nullsafe/flutter_honeywell_captuvo_plugin_nullsafe.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late FlutterHoneywellCaptuvoPlugin _captuvoPlugin;

  @override
  void initState() {
    super.initState();
    _captuvoPlugin = FlutterHoneywellCaptuvoPlugin();

    _captuvoPlugin.onScanDataReceived.listen((scanData) {
      print('Scan Data Received: $scanData');
      // 更新UI或处理数据
    });

    _initializeCaptuvoDevice();
  }

  Future<void> _initializeCaptuvoDevice() async {
    try {
      await _captuvoPlugin.initialize();
      print('Captuvo Device Initialized');
    } catch (e) {
      print('Failed to Initialize Captuvo Device: $e');
    }
  }

  Future<void> _readMagneticStripe() async {
    try {
      String? magneticStripeData = await _captuvoPlugin.readMagneticStripe();
      print('Magnetic Stripe Data: $magneticStripeData');
      // 更新UI或处理数据
    } catch (e) {
      print('Failed to Read Magnetic Stripe: $e');
    }
  }

  Future<void> _configureBeepSound() async {
    try {
      await _captuvoPlugin.setBeepEnabled(true);
      print('Beep Sound Enabled');
    } catch (e) {
      print('Failed to Configure Beep Sound: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Captuvo Device Integration'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _readMagneticStripe,
              child: Text('Read Magnetic Stripe'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _configureBeepSound,
              child: Text('Configure Beep Sound'),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    _captuvoPlugin.dispose();
    super.dispose();
  }
}

请确保在实际应用中根据Captuvo设备的手册和插件的文档进行更多的配置和功能调用。此示例仅展示了基本的集成和使用方法。

回到顶部