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

概述

zywell_printer 是一个用于连接和控制 zywell 打印机的 Flutter 插件。通过该插件,您可以实现与打印机的通信,打印文本、图片或从 Flutter 小部件生成的发票。


使用步骤

1. 引入依赖

pubspec.yaml 文件中添加以下依赖:

dependencies:
  zywell_printer: ^版本号
  widgets_to_image: ^1.0.0

然后执行以下命令安装依赖:

flutter pub get

2. 初始化插件

在你的 Dart 文件中引入并初始化插件:

import 'package:zywell_printer/zywell_printer.dart';
final _zywellPrinterPlugin = ZywellPrinter();
List<NetworkAddress> devices = [];

3. 获取打印机设备列表

调用 scanWifi 方法扫描网络中的打印机设备,并获取可用设备的 IP 地址列表:

Future<void> getDevices() async {
  /// 默认 IP 地址为 '192.168.0.207',您可以根据本地网络配置更改。
  _zywellPrinterPlugin.scanWifi((NetworkAddress addr) {
    print('Found device: ${addr.ip}');
    setState(() {
      devices.add(addr);
    });
  }, '192.168.0.207');
}

4. 连接打印机

使用设备的 IP 地址连接打印机:

bool isSuccess = await _zywellPrinterPlugin.connectIp(devices[index].ip);
if (isSuccess) {
  print('Successfully connected to printer.');
} else {
  print('Failed to connect to printer.');
}

5. 打印文本

通过打印数据对象数组传递文本内容,设置间距和字体样式:

List<PrintRowData> printData = [
  PrintRowData(content: 'Hello World', paddingToTopOfInvoice: 10, font: '3'),
  PrintRowData(content: 'Hello World', paddingToTopOfInvoice: 50, font: '4'),
];

await _zywellPrinterPlugin.printText(
  printData: printData,
  invoiceWidth: 50, // 发票宽度(单位:毫米)
  invoiceHeight: 80, // 发票高度(单位:毫米)
);

6. 打印小部件

通过 widgets_to_image 库将 Flutter 小部件渲染为图片,然后打印出来。

定义打印的小部件

创建一个示例小部件 DemoInvoice

class DemoInvoice extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
      width: 300,
      height: 150,
      color: Colors.white,
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text(
            "Demo Invoice",
            style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
          ),
          SizedBox(height: 10),
          Text("Sample Content"),
        ],
      ),
    );
  }
}

使用 WidgetsToImage 渲染小部件

WidgetsToImage(
  controller: controller,
  child: const DemoInvoice(),
),

打印渲染后的图片

try {
  final d = await controller.capture();
  setState(() {
    bytes = d;
  });
  _zywellPrinterPlugin.printImage(
    image: d!,
    invoiceWidth: 80, // 发票宽度(单位:毫米)
    invoiceHeight: 160, // 发票高度(单位:毫米)
    gapWidth: 10, // 图片左右边距(单位:毫米)
    gapHeight: 10, // 图片上下边距(单位:毫米)
    imageTargetWidth: 600, // 打印时的图片宽度(单位:像素)
  );
} catch (e) {
  print(e);
  print('Zywell Printer Plugin Error');
  print('Failed to print picture.');
}

7. 打印图片

加载本地图片资源并打印:

try {
  ByteData imageBytes = await rootBundle.load('assets/80m.png');
  List<int> values = imageBytes.buffer.asUint8List();
  Uint8List bytes = Uint8List.fromList(values);

  _zywellPrinterPlugin.printThermalImage(
    image: bytes,
    invoiceWidth: 80, // 发票宽度(单位:毫米)
    invoiceHeight: 200, // 发票高度(单位:毫米)
    gapWidth: 50, // 图片左右边距(单位:毫米)
    gapHeight: 10, // 图片上下边距(单位:毫米)
    imageTargetWidth: 600, // 打印时的图片宽度(单位:像素)
  );
} catch (e) {
  print(e);
  print('Zywell Printer Plugin Error');
  print('Failed to print picture.');
}

8. 断开连接

打印完成后,记得断开与打印机的连接:

await _zywellPrinterPlugin.disconnect();

完整示例代码

以下是完整的示例代码,展示了如何使用 zywell_printer 插件进行打印机操作:

import 'dart:io';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:widgets_to_image/widgets_to_image.dart';
import 'package:zywell_printer/print_row_data.dart';
import 'package:zywell_printer/zywell_bluetooth_device.dart';
import 'package:zywell_printer/zywell_printer.dart';
import 'package:zywell_printer_example/demo_invoce.dart';

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

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

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

class _MyAppState extends State<MyApp> {
  final _zywellPrinterPlugin = ZywellPrinter();
  List<NetworkAddress> wifiDevices = [];
  List<ZywellBluetoothDevice> bluetoothDevices = [];
  WidgetsToImageController controller = WidgetsToImageController();
  Uint8List? bytes;

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

  Future<void> getDevices() async {
    _zywellPrinterPlugin.scanWifi((NetworkAddress addr) {
      print('Found device: ${addr.ip}');
      setState(() {
        wifiDevices.add(addr);
      });
    }, '192.168.0.207');
  }

  printText() async {
    List<PrintRowData> printData = [
      PrintRowData(content: 'Hello World', paddingToTopOfInvoice: 10),
    ];
    await _zywellPrinterPlugin.printText(
      printData: printData,
      invoiceWidth: 50,
      invoiceHeight: 80,
    );
  }

  printWidget() async {
    try {
      final d = await controller.capture();
      setState(() {
        bytes = d;
      });
      _zywellPrinterPlugin.printImage(
        image: d!,
        invoiceWidth: 80,
        invoiceHeight: 160,
        gapWidth: 10,
        gapHeight: 10,
        imageTargetWidth: 600,
      );
    } catch (e) {
      print(e);
      print('Zywell Printer Plugin Error');
      print('Failed to print picture.');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Printer Example')),
        body: Center(
          child: Column(
            children: [
            ...List.generate(
              wifiDevices.length,
              (index) => ElevatedButton(
                onPressed: () async {
                  bool isConnected = await _zywellPrinterPlugin.connectIp(wifiDevices[index].ip);
                  if (isConnected) {
                    print('Connected to ${wifiDevices[index].ip}');
                  } else {
                    print('Failed to connect to ${wifiDevices[index].ip}');
                  }
                },
                child: Text('Connect to ${wifiDevices[index].ip}'),
              ),
            ),
            WidgetsToImage(
              controller: controller,
              child: const DemoInvoice(),
            ),
            if (bytes != null) Image.memory(bytes!),
            ElevatedButton(onPressed: printText, child: Text('Print Text')),
            ElevatedButton(onPressed: printWidget, child: Text('Print Widget')),
          ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


zywell_printer 是一个用于在 Flutter 应用中控制打印机的插件。它支持多种打印机型号,包括热敏打印机、标签打印机等。以下是如何在 Flutter 项目中使用 zywell_printer 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  zywell_printer: ^1.0.0  # 请根据最新版本号进行替换

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

2. 初始化打印机

在使用打印机之前,通常需要初始化打印机设备。你可以使用 ZywellPrinter 类来初始化打印机。

import 'package:zywell_printer/zywell_printer.dart';

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

3. 连接打印机

通常情况下,你需要连接到打印机设备。你可以使用蓝牙、Wi-Fi 或 USB 等方式连接打印机。

void connectPrinter() async {
  bool isConnected = await ZywellPrinter.connectPrinter(printerAddress);
  if (isConnected) {
    print("Printer connected successfully");
  } else {
    print("Failed to connect to printer");
  }
}

printerAddress 是打印机的地址,具体格式取决于连接方式(例如蓝牙的 MAC 地址、Wi-Fi 的 IP 地址等)。

4. 打印文本

连接打印机后,你可以发送文本内容进行打印。

void printText() async {
  String text = "Hello, World!";
  bool isPrinted = await ZywellPrinter.printText(text);
  if (isPrinted) {
    print("Text printed successfully");
  } else {
    print("Failed to print text");
  }
}

5. 打印图片

zywell_printer 也支持打印图片。你可以将图片转换为字节数组并发送给打印机。

void printImage() async {
  Uint8List imageBytes = await _loadImageBytes('assets/image.png');
  bool isPrinted = await ZywellPrinter.printImage(imageBytes);
  if (isPrinted) {
    print("Image printed successfully");
  } else {
    print("Failed to print image");
  }
}

Future<Uint8List> _loadImageBytes(String imagePath) async {
  ByteData data = await rootBundle.load(imagePath);
  return data.buffer.asUint8List();
}

6. 断开连接

打印完成后,记得断开与打印机的连接。

void disconnectPrinter() async {
  bool isDisconnected = await ZywellPrinter.disconnectPrinter();
  if (isDisconnected) {
    print("Printer disconnected successfully");
  } else {
    print("Failed to disconnect printer");
  }
}

7. 处理异常

在实际使用中,可能会遇到各种异常情况,如打印机未连接、打印失败等。建议在代码中添加适当的异常处理逻辑。

void printReceipt() async {
  try {
    await ZywellPrinter.initPrinter();
    await ZywellPrinter.connectPrinter(printerAddress);
    await ZywellPrinter.printText("Receipt Content");
    await ZywellPrinter.disconnectPrinter();
  } catch (e) {
    print("An error occurred: $e");
  }
}

8. 权限配置

如果使用蓝牙或网络连接打印机,需要在 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.INTERNET"/>

Info.plist:

<key>NSBluetoothAlwaysUsageDescription</key>
<string>我们需要访问蓝牙以连接打印机</string>
<key>NSLocalNetworkUsageDescription</key>
<string>我们需要访问网络以连接打印机</string>
回到顶部