Flutter功能扩展插件zebrautil的使用

Flutter 功能扩展插件 zebrautil 的使用

Zebra utility 是一个在 Flutter 项目中轻松操作斑马打印机的插件。

功能介绍

  • 在 Android 和 iOS 中发现蓝牙和 Wi-Fi 打印机。
  • 连接和断开打印机连接。
  • 设置介质类型、对比度、校准命令(无需编写任何 ZPL 代码)。
  • 旋转 ZPL 而不改变 ZPL 代码。

安装

Android

build.gradle 文件的 Android 块中添加以下代码:

android {
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
    }
}

AndroidManifest.xml 中添加必要的权限:

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

iOS

Info.plist 文件中添加 Supported external accessory protocols 并添加 com.zebra.rawport。同时添加 Privacy - Local Network Usage Description

<key>UISupportedExternalAccessoryProtocols</key>
<array>
    <string>com.zebra.rawport</string>
</array>

<key>NSLocalNetworkUsageDescription</key>
<string>Your description here</string>

示例

入门指南

首先,创建一个 FutureBuilder 来获取打印机实例:

FutureBuilder(
  future: ZebraUtil.getPrinterInstance(), // 异步获取打印机实例
  builder: (context, snapshot) {
    if (!snapshot.hasData) {
      return const Center(
        child: CircularProgressIndicator(),
      );
    }
    final zebraPrinter = snapshot.data as ZebraPrinter;
    return PrinterTemplate(zebraPrinter);
  },
),

你可以为 onDiscoveryErroronPermissionDenied 添加回调函数:

zebraPrinter.onDiscoveryError =  (errorCode, errorText) {
  print("Error: $errorCode, $errorText");
};
zebraPrinter.onPermissionDenied = () {
  print("Permission denied");
};

方法

配置完实例后,可以使用以下方法开始搜索可用设备:

zebraPrinter.startScanning();

如果要停止扫描,调用:

zebraPrinter.stopScanning();

使用 ZebraController 监听并显示任何设备:

ListenableBuilder(
  listenable: zebraPrinter.controller,
  builder: (context, child) {
    final printers = zebraPrinter.controller.printers;
    if (printers.isEmpty) {
      return _getNotAvailablePage();
    }
    return _getListDevices(printers);
  },
)

连接到打印机时,传递 IP 地址(Wi-Fi 打印机)或 MAC 地址(蓝牙打印机)给 connectToPrinter 方法:

zebraPrinter.connectToPrinter("192.168.47.50");

设置介质类型:

zebraPrinter.setMediaType(EnumMediaType.BlackMark);

校准打印机:

zebraPrinter.calibratePrinter();

设置对比度:

zebraPrinter.setDarkness(25);

打印 ZPL 代码:

zebraPrinter.print("Your ZPL");

旋转 ZPL:

zebraPrinter.rotate();

断开与打印机的连接:

zebraPrinter.disconnect();

注意事项

一旦连接到打印机,可能无法通过扫描找到它。建议在成功连接打印机后停止扫描,直到问题解决。

示例代码

import 'package:flutter/material.dart';
import 'package:zebrautil/zebra_device.dart';
import 'package:zebrautil/zebra_printer.dart';
import 'package:zebrautil/zebra_util.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: FutureBuilder(
        future: ZebraUtil.getPrinterInstance(),
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return const Center(
              child: CircularProgressIndicator(),
            );
          }
          final printer = snapshot.data as ZebraPrinter;
          return PrinterTemplate(printer);
        },
      ),
    );
  }
}

class PrinterTemplate extends StatefulWidget {
  const PrinterTemplate(this.printer, {super.key});
  final ZebraPrinter printer;

  [@override](/user/override)
  State<PrinterTemplate> createState() => _PrinterTemplateState();
}

class _PrinterTemplateState extends State<PrinterTemplate> {
  late ZebraPrinter zebraPrinter;
  late ZebraController controller;
  final String dataToPrint = """^XA
        ^FX Top section with logo, name and address.
        ^CF0,60
        ^FO50,50^GB100,100,100^FS
        ^FO75,75^FR^GB100,100,100^FS
        ^FO93,93^GB40,40,40^FS
        ^FO220,50^FDIntershipping, Inc.^FS
        ^CF0,30
        ^FO220,115^FD1000 Shipping Lane^FS
        ^FO220,155^FDShelbyville TN 38102^FS
        ^FO220,195^FDUnited States (USA)^FS
        ^FO50,250^GB700,3,3^FS
        ^XZ""";

  [@override](/user/override)
  void initState() {
    zebraPrinter = widget.printer;
    controller = zebraPrinter.controller;
    zebraPrinter.startScanning();
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Column(
            children: [
              const Text("My Printers"),
              if (zebraPrinter.isScanning)
                const Text(
                  "Seaching for printers...",
                  style: TextStyle(color: Colors.grey, fontSize: 12),
                ),
            ],
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            if (zebraPrinter.isScanning) {
              zebraPrinter.stopScanning();
            } else {
              zebraPrinter.startScanning();
            }
            setState(() {});
          },
          child: Icon(
              zebraPrinter.isScanning ? Icons.stop_circle : Icons.play_circle),
        ),
        body: ListenableBuilder(
          listenable: controller,
          builder: (context, child) {
            final printers = controller.printers;
            if (printers.isEmpty) {
              return _getNotAvailablePage();
            }
            return _getListDevices(printers);
          },
        ));
  }

  Widget _getListDevices(List<ZebraDevice> printers) {
    return ListView.builder(
        itemBuilder: (BuildContext context, int index) {
          return ListTile(
            title: Text(printers[index].name),
            subtitle: Text(printers[index].status,
                style: TextStyle(color: printers[index].color)),
            leading: IconButton(
              icon: Icon(Icons.print, color: printers[index].color),
              onPressed: () {
                zebraPrinter.print(data: dataToPrint);
              },
            ),
            trailing: IconButton(
              icon: Icon(Icons.bluetooth_connected_rounded,
                  color: printers[index].color),
              onPressed: () {
                zebraPrinter.connectToPrinter(printers[index].address);
              },
            ),
          );
        },
        itemCount: printers.length);
  }

  SizedBox _getNotAvailablePage() {
    return const SizedBox(
      width: double.infinity,
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.center,
        mainAxisSize: MainAxisSize.max,
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text("Printers not found"),
        ],
      ),
    );
  }
}

更多关于Flutter功能扩展插件zebrautil的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter功能扩展插件zebrautil的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用zebrautil插件的示例代码。假设zebrautil是一个提供一系列实用功能的插件,比如字符串处理、日期格式化等(请注意,zebrautil是一个虚构的插件名,实际使用中请替换为真实存在的插件)。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  zebrautil: ^x.y.z  # 替换为实际版本号

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

2. 导入插件

在你的Dart文件中导入zebrautil插件。

import 'package:zebrautil/zebrautil.dart';

3. 使用插件功能

假设zebrautil提供了字符串反转和日期格式化的功能,下面是如何使用这些功能的示例代码。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('ZebraUtil Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Reversed String: ${reverseString("Hello, ZebraUtil!")}',
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 20),
              Text(
                'Formatted Date: ${formatDate(DateTime.now())}',
                style: TextStyle(fontSize: 20),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

// 假设 zebrautil 提供了 reverseString 和 formatDate 函数
String reverseString(String input) {
  // 这里我们直接使用 zebrautil 插件提供的方法
  return ZebraUtil.reverseString(input);
}

String formatDate(DateTime date) {
  // 假设 formatDate 方法将日期格式化为 "yyyy-MM-dd HH:mm:ss"
  return ZebraUtil.formatDate(date, "yyyy-MM-dd HH:mm:ss");
}

4. 假设的 ZebraUtil 类

由于zebrautil是虚构的,这里提供一个假设的ZebraUtil类实现,以便理解其可能的API设计。

class ZebraUtil {
  // 字符串反转方法
  static String reverseString(String input) {
    return input.split('').reversed.join();
  }

  // 日期格式化方法
  static String formatDate(DateTime date, String pattern) {
    // 这里使用 Dart 的 intl 包来进行日期格式化
    import 'package:intl/intl.dart';
    DateFormat formatter = DateFormat(pattern);
    return formatter.format(date);
  }
}

注意:在实际项目中,ZebraUtil类及其方法将由zebrautil插件提供,你不需要自己实现。上述代码只是为了展示如何调用这些假设的方法。

总结

以上示例展示了如何在Flutter项目中使用一个假设的zebrautil插件进行字符串反转和日期格式化。请确保替换为实际存在的插件,并根据插件文档调整代码。

回到顶部