Flutter打印机控制插件sunmi_printerx的使用

Flutter打印机控制插件sunmi_printerx的使用

特性

  • 发现可用打印机
  • 获取打印机状态
  • 发送打印命令
  • 打开并检查现金抽屉的状态

安装

在你的pubspec.yaml文件中添加以下依赖项:

dependencies:
  sunmi_printerx: ^1.0.0

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

使用

导入插件

import 'package:sunmi_printerx/sunmi_printerx.dart';

初始化插件

final sunmiPrinterX = SunmiPrinterX();

API 和示例

SunmiPrinterX

方法

  • Future<List<Printer>> getPrinters()
    • 获取可用打印机列表。

示例:

final sunmiPrinterX = SunmiPrinterX();
List<Printer> printers = await sunmiPrinterX.getPrinters();
print(printers);

Printer

方法

  • Future<PrinterStatus> getStatus()
    • 获取打印机状态。

示例:

PrinterStatus status = await printer.getStatus();
print(status);
  • Future<void> openCashDrawer()
    • 打开现金抽屉。

示例:

await printer.openCashDrawer();
  • Future<bool> isCashDrawerOpen()
    • 检查现金抽屉是否已打开。

示例:

bool isOpen = await printer.isCashDrawerOpen();
print(isOpen);
  • Future<void> printEscPosCommands(Uint8List commands)
    • 发送ESC/POS命令到打印机。

示例:

await printer.printEscPosCommands(commands);
  • Future<void> waitForCashDrawerClose()
    • 等待现金抽屉关闭。

示例:

await printer.waitForCashDrawerClose();

示例代码

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

import 'package:flutter/services.dart';
import 'package:sunmi_printerx/printer.dart';
import 'package:sunmi_printerx/sunmi_printerx.dart';
import 'package:sunmi_printerx/align.dart' as align;
import 'package:flutter_esc_pos_utils/flutter_esc_pos_utils.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List<Printer> printers = [];
  Map<String, bool> cashDrawerOpen = {};
  final _sunmiPrinterXPlugin = SunmiPrinterX();
  final _messangerKey = GlobalKey<ScaffoldMessengerState>();

  [@override](/user/override)
  void initState() {
    super.initState();
    initDefaultPrinter();
  }

  // 平台消息是异步的,因此我们在异步方法中进行初始化。
  Future<void> initDefaultPrinter() async {
    try {
      final ps = await _sunmiPrinterXPlugin.getPrinters();
      if (!mounted) return;
      setState(() {
        printers = ps;
        cashDrawerOpen =
            Map.fromIterable(ps, key: (e) => e.id, value: (_) => false);
      });
    } on PlatformException {
      printers = [];
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
        scaffoldMessengerKey: _messangerKey,
        home: Scaffold(
          appBar: AppBar(
            title: const Text('插件示例应用'),
          ),
          body: Column(
            children: [
              for (final printer in printers)
                ListTile(
                  title: Text(
                      "打印机: ${printer.name} (现金抽屉: ${cashDrawerOpen[printer.id] == true ? '打开' : '关闭'})"),
                  subtitle: Text(printer.status.toString()),
                  trailing: Wrap(
                    children: [
                      TextButton(
                          onPressed: () async {
                            await printer.setAlign(align.Align.left);
                            await printer.printText('!"§$%&/()=? EUR €€€€€€ !',
                                bold: true);
                            await printer.setAlign(align.Align.center);
                            await printer.printText('ÄÖÜäöüß');
                            await printer.setAlign(align.Align.right);
                            await printer.printText('文本宽度比例1!',
                                underline: true, textWidthRatio: 1);
                            await printer.setAlign(align.Align.left);
                            await printer.printText('文本高度比例1!',
                                underline: true, textWidthRatio: 1);
                            await printer.printText('两个高度比例1!',
                                textWidthRatio: 1, textHeightRatio: 1);
                            await printer.printText('间距3!', textSpace: 3);
                            await printer.addText('下划线 ',
                                underline: true);
                            await printer.addText('加粗 ', bold: true);
                            await printer.addText('删除线\n',
                                strikethrough: true);
                            await printer.setAlign(align.Align.left);
                            // https://pub.dev 重复20次
                            await printer.printQrCode(
                                List.filled(20, 'https://pub.dev').join(),
                                dot: 5);

                            await printer.printTexts([
                              '列1',
                              '列2',
                              '列3',
                            ], columnWidths: [
                              3,
                              6,
                              3
                            ], columnAligns: [
                              align.Align.left,
                              align.Align.center,
                              align.Align.right
                            ]);

                            await printer.autoOut();
                          },
                          child: const Text('打印SDK')),
                      TextButton(
                          onPressed: () async {
                            final profile = await CapabilityProfile.load();
                            final generator =
                                Generator(PaperSize.mm80, profile);
                            List<int> bytes = [];

                            bytes += generator.text(
                                '常规: aA bB cC dD eE fF gG hH iI jJ kK lL mM nN oO pP qQ rR sS tT uU vV wW xX yY zZ');
                            bytes += generator.text(
                                '特殊字符1: àÀ èÈ éÉ ûÛ üÜ çÇ ôÔ',
                                styles: const PosStyles(codeTable: 'CP1252'));
                            bytes += generator.text('特殊字符2: blåbærgrød',
                                styles: const PosStyles(codeTable: 'CP1252'));

                            bytes += generator.text('加粗文本',
                                styles: const PosStyles(bold: true));
                            bytes += generator.text('反向文本',
                                styles: const PosStyles(reverse: true));
                            bytes += generator.text('下划线文本',
                                styles: const PosStyles(underline: true),
                                linesAfter: 1);
                            bytes += generator.text('左对齐',
                                styles: const PosStyles(align: PosAlign.left));
                            bytes += generator.text('居中对齐',
                                styles:
                                    const PosStyles(align: PosAlign.center));
                            bytes += generator.text('右对齐',
                                styles: const PosStyles(align: PosAlign.right),
                                linesAfter: 1);

                            bytes += generator.row([
                              PosColumn(
                                text: '列3',
                                width: 3,
                                styles: const PosStyles(
                                    align: PosAlign.center, underline: true),
                              ),
                              PosColumn(
                                text: '列6',
                                width: 6,
                                styles: const PosStyles(
                                    align: PosAlign.center, underline: true),
                              ),
                              PosColumn(
                                text: '列3',
                                width: 3,
                                styles: const PosStyles(
                                    align: PosAlign.center, underline: true),
                              ),
                            ]);

                            bytes += generator.text('文本大小200%',
                                styles: const PosStyles(
                                  height: PosTextSize.size2,
                                  width: PosTextSize.size2,
                                ));

                            // 打印条形码
                            final List<int> barData = [
                              1,
                              2,
                              3,
                              4,
                              5,
                              6,
                              7,
                              8,
                              9,
                              0,
                              4
                            ];
                            bytes += generator.barcode(Barcode.upcA(barData));

                            bytes += generator.feed(2);
                            bytes += generator.cut();

                            await printer
                                .printEscPosCommands(Uint8List.fromList(bytes));
                          },
                          child: const Text('打印ESC/POS')),
                      TextButton(
                          onPressed: () async {
                            await printer.openCashDrawer();
                            setState(() {
                              cashDrawerOpen[printer.id] = true;
                            });
                            print("现金抽屉已打开");
                            await printer.waitForCashDrawerClose();
                            setState(() {
                              cashDrawerOpen[printer.id] = false;
                            });
                            print("现金抽屉已关闭");
                          },
                          child: const Text('打开现金抽屉')),
                      TextButton(
                          onPressed: () async {
                            final status = await printer.getStatus();
                            _messangerKey.currentState?.showSnackBar(
                              SnackBar(
                                content: Text('状态: $status'),
                              ),
                            );
                          },
                          child: const Text('状态')),
                    ],
                  ),
                ),
              TextButton(
                  onPressed: initDefaultPrinter, child: const Text('刷新')),
            ],
          ),
        ));
  }
}

更多关于Flutter打印机控制插件sunmi_printerx的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter打印机控制插件sunmi_printerx的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


sunmi_printerx 是一个用于控制 Sunmi 打印机的 Flutter 插件。它允许你在 Flutter 应用中与 Sunmi 打印机进行交互,执行打印任务、查询打印机状态等操作。以下是如何在 Flutter 项目中使用 sunmi_printerx 插件的基本步骤。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 sunmi_printerx 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  sunmi_printerx: ^1.0.0  # 请使用最新版本

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

2. 初始化打印机

在使用打印机之前,你需要初始化打印机。通常在应用启动时进行初始化。

import 'package:sunmi_printerx/sunmi_printerx.dart';

void initPrinter() async {
  bool isInitialized = await SunmiPrinterX.initPrinter();
  if (isInitialized) {
    print("Printer initialized successfully");
  } else {
    print("Failed to initialize printer");
  }
}

3. 打印文本

你可以使用 SunmiPrinterX.printText 方法来打印文本。

void printText() async {
  await SunmiPrinterX.printText("Hello, Sunmi Printer!");
  await SunmiPrinterX.lineWrap(2);  // 打印两行空白行
}

4. 打印图片

sunmi_printerx 还支持打印图片。你可以使用 SunmiPrinterX.printImage 方法来打印图片。

void printImage() async {
  ByteData data = await rootBundle.load('assets/images/logo.png');
  Uint8List bytes = data.buffer.asUint8List();
  await SunmiPrinterX.printImage(bytes);
  await SunmiPrinterX.lineWrap(2);
}

5. 打印二维码和条形码

你可以使用 SunmiPrinterX.printQRCodeSunmiPrinterX.printBarcode 方法来打印二维码和条形码。

void printQRCode() async {
  await SunmiPrinterX.printQRCode("https://example.com", width: 200, height: 200);
  await SunmiPrinterX.lineWrap(2);
}

void printBarcode() async {
  await SunmiPrinterX.printBarcode("123456789012", barcodeType: SunmiBarcodeType.CODE128, width: 200, height: 100);
  await SunmiPrinterX.lineWrap(2);
}

6. 查询打印机状态

你可以使用 SunmiPrinterX.getPrinterStatus 方法来查询打印机的状态。

void checkPrinterStatus() async {
  SunmiPrinterStatus status = await SunmiPrinterX.getPrinterStatus();
  switch (status) {
    case SunmiPrinterStatus.NORMAL:
      print("Printer is normal");
      break;
    case SunmiPrinterStatus.OUT_OF_PAPER:
      print("Printer is out of paper");
      break;
    case SunmiPrinterStatus.OVERHEATED:
      print("Printer is overheated");
      break;
    default:
      print("Unknown printer status");
  }
}

7. 其他功能

sunmi_printerx 还提供了其他功能,如设置打印对齐方式、字体大小、行间距等。你可以查阅插件的文档以了解更多详细信息。

8. 示例

以下是一个简单的示例,展示了如何初始化打印机并打印一些内容。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  void initPrinter() async {
    bool isInitialized = await SunmiPrinterX.initPrinter();
    if (isInitialized) {
      print("Printer initialized successfully");
    } else {
      print("Failed to initialize printer");
    }
  }

  void printContent() async {
    await SunmiPrinterX.printText("Hello, Sunmi Printer!");
    await SunmiPrinterX.lineWrap(2);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Sunmi Printer Example"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: initPrinter,
              child: Text("Initialize Printer"),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: printContent,
              child: Text("Print Text"),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部