Flutter Elgin Printer 是一个用于Flutter 与 Elgin 打印机交互的 Flutter 插件

发布于 1周前 作者 sinazl 最后一次编辑是 5天前 来自 Flutter

Flutter Elgin Printer Plugin 使用指南

概述

Elgin Printer 是一个用于与 Elgin 打印机交互的 Flutter 插件,主要用于 Android 平台。它支持多种连接方式(如 USB、TCP/IP、蓝牙等),并提供了丰富的打印功能,包括文本、条形码、二维码、图像以及各种状态检查和设备控制。

安装步骤

由于插件依赖于外部库,因此需要对 Android 项目进行一些修改:

  1. android/app/build.gradle 文件中将 minSdkVersion 设置为 21。
  2. 下载最新的 SDK E1 并将其解压后的 .aar 文件放入 android/app/libs 目录。
  3. 修改 android/app/build.gradle 文件,在 dependencies 部分添加以下内容:
    dependencies {  
        implementation "androidx.startup:startup-runtime:1.1.0"
        implementation fileTree(include: ['*.aar'], dir: 'libs')
    }
    
  4. 如果出现图标冲突问题,可以在 AndroidManifest.xml 中使用 tools:replace 属性覆盖默认设置:
    <application
        android:name="io.flutter.app.FlutterApplication"
        tools:replace="android:label,android:icon">
    

初始化与连接

基本连接示例

final _driver = ElginPrinter(
    type: ElginPrinterType.TCP,
    model: ElginPrinterModel.GENERIC_TCP,
    connection: '192.168.5.111',
    parameter: 9100,
);

try {
    final int? result = await Elgin.printer.connect(driver: _driver);
    if (result != null && result == 0) {
        await Elgin.printer.printString('HELLO PRINTER');
        await Elgin.printer.feed(2);
        await Elgin.printer.cut(2);
        await Elgin.printer.disconnect();
    }
} on ElginException catch (e) {
    ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(e.error.message)));
}

更多连接方式示例

class Home extends StatefulWidget {
    const Home({Key? key}) : super(key: key);

    @override
    _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
    // 省略部分代码...

    Future<int?> startPrinter(ElginPrinter driver) async {
        try {
            final int? result = await Elgin.printer.connect(driver: driver);
            setState(() {
                printBinded = result == 0 ? true : false;
            });
            if (result == 0) {
                String version = await Elgin.printer.libVersion;
                setState(() {
                    printerVersion = version;
                });
            }
            return result;
        } on ElginException catch (e) {
            ScaffoldMessenger.of(context)
                .showSnackBar(SnackBar(content: Text(e.error.message)));
            return null;
        }
    }

    // 省略按钮点击事件处理逻辑...
}

功能列表

  • 打印字符串printString
  • 前进若干行feed
  • 切割纸张cut
  • 打印条形码printBarCode
  • 打印二维码printQRCode
  • 发送原始 ESC/POS 命令printRaw
  • 触发蜂鸣器beep
  • 打开或关闭钱箱customCashier, elginCashier
  • 绘制分隔线line
  • 打印图片printImage
  • 获取打印机版本信息及状态libVersion, statusSensor
  • 打印 SAT XML 数据printSAT
  • 打印 NFC-e XML 数据printNFCE
  • 打印 TEF 数据printTEF

异常捕获

该插件实现了详细的异常处理机制,能够捕捉并返回具体的错误类型及其描述信息。例如:

on ElginException catch (e) {
    ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(e.error.message)));
}

更多关于Flutter Elgin Printer 是一个用于Flutter 与 Elgin 打印机交互的 Flutter 插件的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Elgin Printer 是一个用于Flutter 与 Elgin 打印机交互的 Flutter 插件的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,虽然没有一个官方或广泛认知的名为 elgin 的插件,但基于你的假设,如果 elgin 是一个与地理位置服务相关的插件,我们可以提供一个使用类似功能插件的示例代码。Flutter 社区中有很多用于地理位置服务的插件,比如 geolocator 插件。以下是如何使用 geolocator 插件来获取当前地理位置的示例代码。

首先,确保你已经在 pubspec.yaml 文件中添加了 geolocator 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  geolocator: ^9.0.2  # 请检查最新版本号
  geocoding: ^2.0.0   # 可选,用于将地理坐标转换为地址信息

然后,运行 flutter pub get 来获取依赖。

接下来,在你的 Dart 文件中,你可以按照以下方式使用 geolocator 插件:

import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:geocoding/geocoding.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Geolocation Example'),
        ),
        body: Center(
          child: FutureBuilder<Position>(
            future: _determinePosition(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.done) {
                if (snapshot.hasError) {
                  return Text('Error: ${snapshot.error}');
                } else {
                  final Position position = snapshot.data!;
                  return _Location(position);
                }
              } else {
                return CircularProgressIndicator();
              }
            },
          ),
        ),
      ),
    );
  }

  Future<Position> _determinePosition() async {
    bool serviceEnabled;
    LocationPermission permission;

    // Test if location services are enabled.
    serviceEnabled = await Geolocator.isLocationServiceEnabled();
    if (!serviceEnabled) {
      return Future.error('Location services are disabled.');
    }

    permission = await Geolocator.checkPermission();
    if (permission == LocationPermission.denied) {
      permission = await Geolocator.requestPermission();
      if (permission == LocationPermission.denied) {
        return Future.error('Location permissions are denied');
      }
    }
    if (permission == LocationPermission.deniedForever) {
      // Permissions are permanently denied, we cannot request permissions anymore.
      return Future.error(
          'Location permissions are permanently denied, we cannot request permissions.');
    }

    // When we reach here, permissions are granted and we can use the geolocator.
    return await Geolocator.getCurrentPosition(
      desiredAccuracy: LocationAccuracy.high,
    );
  }
}

class _Location extends StatelessWidget {
  final Position position;

  _Location(this.position);

  @override
  Widget build(BuildContext context) {
    List<Placemark> placemarks = [];
    placemarks = await placemarkFromCoordinates(position.latitude, position.longitude);

    Placemark place = placemarks.isNotEmpty ? placemarks.first : Placemark(locality: 'Unknown');

    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Latitude: ${position.latitude}'),
        Text('Longitude: ${position.longitude}'),
        Text('Address: ${place.locality}, ${place.postalCode}, ${place.country}'),
      ],
    );
  }
}

在这个示例中:

  1. 我们首先检查位置服务是否启用。
  2. 然后检查并请求位置权限。
  3. 使用 Geolocator.getCurrentPosition() 获取当前位置。
  4. 使用 placemarkFromCoordinates() 将地理坐标转换为地址信息(需要 geocoding 插件)。

请注意,这个示例代码是基于 geolocator 插件的,而不是 elgin 插件,因为 elgin 插件并不是 Flutter 社区中广泛认知的地理位置服务插件。如果你的 elgin 插件确实存在且具有类似功能,你应该参考该插件的官方文档来调整代码。

回到顶部