zebrautil 1.4.42  zebrautil: ^1.4.42 copied to clipboard
zebrautil: ^1.4.42 copied to clipboard
A plugin for working with zebra printers in flutter
Flutter ZebraUtil #
Zebra utility is a plugin for working easily with zebra printers in your flutter project.
- Discovery bluetooth and wifi printers in android and bluetooth printers in iOS.
- Connect and disconnect to printers
- Set mediatype, darkness, calibrate command without writing any ZPL code for ZPL printers.
- Rotate ZPL without changing your zpl.
Installation #
Android #
Add this code to android block in build.gradle (Module level).
android {
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
    }
}
Include the necessary permission in the Android Manifest.
    <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 #
Add Supported external accessory protocols in your info.plist and then add com.zebra.rawportto its.
Add Privacy - Local Network Usage Description in your info.plist.
Example #
Getting Started #
There is a static class that allows you to create different instances of ZebraPrinter.
     FutureBuilder(
        future: ZebraUtil.getPrinterInstance(), //required async 
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return const Center(
              child: CircularProgressIndicator(),
            );
          }
          final zebraPrinter = snapshot.data as ZebraPrinter;
          return PrinterTemplate(zebraPrinter);
        },
      ),
You can then pass callbacks for either onDiscoveryError, onPermissionDenied, or neither.
     zebraPrinter.onDiscoveryError =  ( errorCode, errorText) {
      print("Error: $errorCode, $errorText");
    };
    zebraPrinter.onPermissionDenied = () {
      print("Permission denied");
    }
Methods #
After configuring the instance, use the following method to start searching for available devices:
  zebraPrinter.startScanning();
It won't stop automatically, if you wish to stop the scan you must call:
 zebraPrinter.stopScanning();
To listen for and display any devices (ZebraDevice), you can use the Zebra printer ZebraController
ListenableBuilder(
    listenable: zebraPrinter.controller,
    builder: (context, child) {
      final printers = zebraPrinter.controller.printers;
      if (printers.isEmpty) {
        return _getNotAvailablePage();
      }
      return _getListDevices(printers);
    },
  )
For connecting to printer, pass ipAddreess for wifi printer or macAddress for bluetooth printer to connectToPrinter method.
 zebraPrinter.connectToPrinter("192.168.47.50");
You can set media type between Lable, Journal and BlackMark. You can choose media type by EnumMediaType.
  zebraPrinter.setMediaType(EnumMediaType.BlackMark);
You may callibrate printer after set media type. You can use this method.
zebraPrinter.calibratePrinter();
You can set darkness. the valid darkness value are -99,-75,-50,-25,0,25,50,75,100,125,150,175,200.
  zebraPrinter.setDarkness(25);
For print ZPL, you pass ZPL to print method.
  zebraPrinter.print("Your ZPL");
For rotate your ZPL without changing your ZPL, you can use this method. You can call this again for normal printing.
  zebraPrinter.rotate();
For disconnect from printer, use disconnect method. For battery saver, disconnect from printer when you not need printer.
  zebraPrinter.disconnect();
P.S #
You need to be aware that once you are connected to a printer, it may not be detected by the scan. I recommend stopping the scan after successfully connecting to a printer until the issue is resolved.
Acknowledgements #
I would like to express my gratitude to Deltec for fostering a friendly and supportive environment.
Special thanks to MythiCode for providing the foundational code for this library. Specifically, I appreciate the following contributions:
- Base implementation for core functionalities
- Initial setup and structure
- Key algorithms and methods
Thank you to everyone who made this project possible!