Flutter热敏打印机控制插件thermal_printer的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter热敏打印机控制插件thermal_printer的使用

thermal_printer 是一个用于发现打印机并发送打印命令的库。它支持多种平台(如Android、iOS和Windows)以及不同的接口(如蓝牙、BLE、USB和WiFi/以太网)。本文将介绍如何在Flutter项目中使用该插件。

主要特性

  • 支持Android、iOS和Windows平台
  • 扫描蓝牙设备
  • 发送原始的 List<int> bytes 数据到设备

平台支持矩阵

功能 Android iOS Windows 描述
USB接口 🔳 允许连接USB设备
蓝牙经典接口 🔳 🔳 允许连接经典蓝牙设备
蓝牙低功耗(BLE)接口 🔳 允许连接BLE设备
网络(以太网/WiFi)接口 允许连接网络设备

如何使用

初始化PrinterManager实例

首先,需要初始化 PrinterManager 实例:

import 'package:thermal_printer/thermal_printer.dart';

var printerManager = PrinterManager.instance;

扫描设备

根据打印机类型(如蓝牙、USB或网络),可以调用 discovery 方法来扫描设备:

var devices = [];
_scan(PrinterType type, {bool isBle = false}) {
  // 查找打印机
  PrinterManager.instance.discovery(type: type, isBle: isBle).listen((device) {
    devices.add(device);
  });
}

连接设备

选择合适的打印机类型,并连接到选定的设备:

_connectDevice(PrinterDevice selectedPrinter, PrinterType type, {bool reconnect = false, bool isBle = false, String? ipAddress = null}) async {
  switch (type) {
    case PrinterType.usb:
      await PrinterManager.instance.connect(
          type: type,
          model: UsbPrinterInput(name: selectedPrinter.name, productId: selectedPrinter.productId, vendorId: selectedPrinter.vendorId));
      break;
    case PrinterType.bluetooth:
      await PrinterManager.instance.connect(
          type: type,
          model: BluetoothPrinterInput(
              name: selectedPrinter.name,
              address: selectedPrinter.address!,
              isBle: isBle,
              autoConnect: reconnect));
      break;
    case PrinterType.network:
      await PrinterManager.instance.connect(type: type, model: TcpPrinterInput(ipAddress: ipAddress ?? selectedPrinter.address!));
      break;
    default:
  }
}

断开连接

断开当前连接的设备:

_disconnectDevice(PrinterType type) async {
  await PrinterManager.instance.disconnect(type: type);
}

监听蓝牙状态变化

监听蓝牙设备的状态变化:

PrinterManager.instance.stateBluetooth.listen((status) {
  log(' ----------------- status bt $status ------------------ ');
});

发送字节数据进行打印

生成要打印的数据,并通过 send 方法发送给打印机:

_sendBytesToPrint(List<int> bytes, PrinterType type) async { 
  PrinterManager.instance.send(type: type, bytes: bytes);
}

示例Demo

以下是一个完整的示例代码,展示了如何使用 thermal_printer 插件:

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

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  var defaultPrinterType = PrinterType.bluetooth;
  var _isConnected = false;
  var printerManager = PrinterManager.instance;
  var devices = <PrinterDevice>[];
  StreamSubscription<PrinterDevice>? _subscription;

  @override
  void initState() {
    super.initState();
    _scan();
  }

  void _scan() {
    devices.clear();
    _subscription = printerManager.discovery(type: defaultPrinterType).listen((device) {
      devices.add(device);
      setState(() {});
    });
  }

  void _connectDevice(PrinterDevice device) async {
    await printerManager.connect(
        type: defaultPrinterType,
        model: BluetoothPrinterInput(name: device.name, address: device.address!));
    setState(() {
      _isConnected = true;
    });
  }

  void _disconnectDevice() async {
    await printerManager.disconnect(type: defaultPrinterType);
    setState(() {
      _isConnected = false;
    });
  }

  void _printTestTicket() async {
    final profile = await CapabilityProfile.load();
    final generator = Generator(PaperSize.mm58, profile);
    List<int> bytes = [];

    bytes += generator.text('Test Print', styles: const PosStyles(align: PosAlign.center));
    bytes += generator.text('Product 1');
    bytes += generator.text('Product 2');

    printerManager.send(type: defaultPrinterType, bytes: bytes);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Thermal Printer Demo')),
        body: Center(
          child: Column(
            children: [
              ElevatedButton(
                onPressed: !_isConnected ? () => _connectDevice(devices.first) : null,
                child: const Text("Connect"),
              ),
              ElevatedButton(
                onPressed: _isConnected ? _disconnectDevice : null,
                child: const Text("Disconnect"),
              ),
              ElevatedButton(
                onPressed: _isConnected ? _printTestTicket : null,
                child: const Text("Print Test Ticket"),
              ),
              Expanded(
                child: ListView.builder(
                  itemCount: devices.length,
                  itemBuilder: (context, index) {
                    final device = devices[index];
                    return ListTile(
                      title: Text(device.name),
                      subtitle: Text(device.address!),
                      onTap: () => _connectDevice(device),
                    );
                  },
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

此示例展示了如何扫描、连接、断开连接和打印测试票。你可以根据自己的需求修改和扩展这个示例。


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

1 回复

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


当然,以下是如何在Flutter项目中使用thermal_printer插件来控制热敏打印机的示例代码。thermal_printer插件允许你通过蓝牙或USB连接来控制热敏打印机。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  thermal_printer: ^x.y.z  # 替换为最新版本号

2. 导入插件

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

import 'package:thermal_printer/thermal_printer.dart';

3. 初始化打印机

你需要初始化打印机,并检查是否有可用的打印机设备。以下是一个简单的示例,用于通过蓝牙连接打印机:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List<BluetoothDevice> devices = [];
  BluetoothPrinter? printer;

  @override
  void initState() {
    super.initState();
    initPrinter();
  }

  void initPrinter() async {
    // 获取所有可用的蓝牙设备
    devices = await BluetoothPrinter.scanDevices();

    if (devices.isNotEmpty) {
      // 选择第一个设备(这里应该根据用户选择来确定)
      printer = BluetoothPrinter(devices.first);
      await printer!.connect();
      print("Connected to printer: ${devices.first.name}");
    } else {
      print("No devices found");
    }
  }

  void printReceipt() async {
    if (printer != null && printer!.isConnected) {
      await printer!.printText("Hello, this is a receipt!\n");
      await printer!.printText("Thank you for your purchase.\n");
      await printer!.cutPaper();
    } else {
      print("Printer is not connected");
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Thermal Printer Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('Available Devices:'),
              Text(devices.map((device) => device.name).join(", ")),
              ElevatedButton(
                onPressed: printReceipt,
                child: Text('Print Receipt'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

4. 运行应用

确保你的设备启用了蓝牙,并且热敏打印机已经开启并处于可被发现的状态。然后运行你的Flutter应用,你应该能看到扫描到的蓝牙设备列表,并且能够通过点击按钮来打印收据。

注意事项

  • 在实际使用中,你可能需要让用户从扫描到的设备列表中选择一个打印机。
  • 你可能需要处理更多的错误情况,比如连接失败、打印失败等。
  • 对于USB连接,你需要使用UsbPrinter类而不是BluetoothPrinter类,并且需要处理USB设备的权限和连接。

这是一个基本的示例,希望能够帮助你入门如何在Flutter中使用thermal_printer插件来控制热敏打印机。

回到顶部