Flutter蓝牙热敏打印机控制插件flutter_esc_pos_bluetooth的使用

Flutter蓝牙热敏打印机控制插件flutter_esc_pos_bluetooth的使用

esc_pos_bluetooth

Pub Version

该库允许使用蓝牙打印机打印收据。对于WiFi/以太网打印机,请使用esc_pos_printer库。

TODO (PRs是受欢迎的!)

  • 将字节数据拆分成块:问题
  • 使用GS ( k命令打印QR码(已支持从图像打印QR码)
  • 使用GS ( k命令打印PDF-417条形码
  • 使用ESC 3 <n>命令设置行间距

如何帮助

  • 测试你的打印机并添加到表格中:WiFi/网络打印机蓝牙打印机
  • 测试并报告错误
  • 分享你对改进的建议(代码优化,新功能等)
  • PR是受欢迎的!

已测试打印机

以下是一些已用此库测试过的打印机。请添加你测试过的模型,以维护和改进此库,并帮助其他人选择合适的打印机。

生成收据

简单带样式的收据

Ticket testTicket() {
  final Ticket ticket = Ticket(PaperSize.mm80);

  ticket.text(
      'Regular: 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');
  ticket.text('Special 1: àÀ èÈ éÉ ûÛ üÜ çÇ ôÔ',
      styles: PosStyles(codeTable: PosCodeTable.westEur));
  ticket.text('Special 2: blåbærgrød',
      styles: PosStyles(codeTable: PosCodeTable.westEur));

  ticket.text('Bold text', styles: PosStyles(bold: true));
  ticket.text('Reverse text', styles: PosStyles(reverse: true));
  ticket.text('Underlined text',
      styles: PosStyles(underline: true), linesAfter: 1);
  ticket.text('Align left', styles: PosStyles(align: PosAlign.left));
  ticket.text('Align center', styles: PosStyles(align: PosAlign.center));
  ticket.text('Align right',
      styles: PosStyles(align: PosAlign.right), linesAfter: 1);

  ticket.text('Text size 200%',
      styles: PosStyles(
        height: PosTextSize.size2,
        width: PosTextSize.size2,
      ));

  ticket.feed(2);
  ticket.cut();
  return ticket;
}

你可以在这里找到更多例子:esc_pos_utils

打印收据

PrinterBluetoothManager printerManager = PrinterBluetoothManager();

printerManager.scanResults.listen((printers) async {
  // 存储找到的打印机
});
printerManager.startScan(Duration(seconds: 4));

// ...

printerManager.selectPrinter(printer);
final PosPrintResult res = await printerManager.printTicket(testTicket());

print('打印结果: ${res.msg}');

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

1 回复

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


flutter_esc_pos_bluetooth 是一个用于在 Flutter 应用中控制蓝牙热敏打印机的插件。它基于 ESC/POS 指令集,允许你通过蓝牙连接打印机并发送打印指令。以下是如何使用 flutter_esc_pos_bluetooth 插件的基本步骤。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_esc_pos_bluetooth: ^0.3.0

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

2. 请求蓝牙权限

在 Android 和 iOS 上,使用蓝牙功能需要相应的权限。确保在 AndroidManifest.xmlInfo.plist 中添加必要的权限。

AndroidManifest.xml:

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

Info.plist:

<key>NSBluetoothAlwaysUsageDescription</key>
<string>We need access to Bluetooth to connect to the printer.</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>We need access to Bluetooth to connect to the printer.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>We need access to location to scan for Bluetooth devices.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>We need access to location to scan for Bluetooth devices.</string>

3. 扫描并连接蓝牙设备

使用 flutter_esc_pos_bluetooth 插件扫描并连接到蓝牙打印机。

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

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

class _PrinterScreenState extends State<PrinterScreen> {
  PrinterBluetoothManager printerManager = PrinterBluetoothManager();
  List<PrinterBluetooth> _devices = [];

  [@override](/user/override)
  void initState() {
    super.initState();
    printerManager.scanResults.listen((devices) {
      setState(() {
        _devices = devices;
      });
    });
  }

  void _startScan() {
    printerManager.startScan(Duration(seconds: 4));
  }

  void _connectToDevice(PrinterBluetooth device) async {
    await printerManager.selectPrinter(device);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Bluetooth Printer'),
      ),
      body: Column(
        children: [
          ElevatedButton(
            onPressed: _startScan,
            child: Text('Scan for Devices'),
          ),
          Expanded(
            child: ListView.builder(
              itemCount: _devices.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(_devices[index].name),
                  subtitle: Text(_devices[index].address),
                  onTap: () => _connectToDevice(_devices[index]),
                );
              },
            ),
          ),
        ],
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    printerManager.stopScan();
    super.dispose();
  }
}

4. 打印内容

连接成功后,你可以使用 PrinterBluetoothManager 发送打印指令。

void _printTestReceipt() async {
  final profile = await CapabilityProfile.load();
  final generator = Generator(PaperSize.mm58, profile);

  List<int> bytes = [];
  bytes += generator.text('Test Receipt');
  bytes += generator.text('----------------');
  bytes += generator.text('Item 1: \$10.00');
  bytes += generator.text('Item 2: \$20.00');
  bytes += generator.text('Total: \$30.00');
  bytes += generator.text('----------------');
  bytes += generator.text('Thank you!');
  bytes += generator.feed(2);
  bytes += generator.cut();

  printerManager.printBytes(bytes);
}

5. 完整示例

将上述代码整合到一个完整的示例中:

import 'package:flutter/material.dart';
import 'package:flutter_esc_pos_bluetooth/flutter_esc_pos_bluetooth.dart';
import 'package:flutter_esc_pos_utils/flutter_esc_pos_utils.dart';

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

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

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

class _PrinterScreenState extends State<PrinterScreen> {
  PrinterBluetoothManager printerManager = PrinterBluetoothManager();
  List<PrinterBluetooth> _devices = [];

  [@override](/user/override)
  void initState() {
    super.initState();
    printerManager.scanResults.listen((devices) {
      setState(() {
        _devices = devices;
      });
    });
  }

  void _startScan() {
    printerManager.startScan(Duration(seconds: 4));
  }

  void _connectToDevice(PrinterBluetooth device) async {
    await printerManager.selectPrinter(device);
  }

  void _printTestReceipt() async {
    final profile = await CapabilityProfile.load();
    final generator = Generator(PaperSize.mm58, profile);

    List<int> bytes = [];
    bytes += generator.text('Test Receipt');
    bytes += generator.text('----------------');
    bytes += generator.text('Item 1: \$10.00');
    bytes += generator.text('Item 2: \$20.00');
    bytes += generator.text('Total: \$30.00');
    bytes += generator.text('----------------');
    bytes += generator.text('Thank you!');
    bytes += generator.feed(2);
    bytes += generator.cut();

    printerManager.printBytes(bytes);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Bluetooth Printer'),
      ),
      body: Column(
        children: [
          ElevatedButton(
            onPressed: _startScan,
            child: Text('Scan for Devices'),
          ),
          Expanded(
            child: ListView.builder(
              itemCount: _devices.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(_devices[index].name),
                  subtitle: Text(_devices[index].address),
                  onTap: () => _connectToDevice(_devices[index]),
                );
              },
            ),
          ),
          ElevatedButton(
            onPressed: _printTestReceipt,
            child: Text('Print Test Receipt'),
          ),
        ],
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    printerManager.stopScan();
    super.dispose();
  }
}
回到顶部