zebra_tc

Flutter plugin for Zebra TC series Android devices that integrates with the built-in barcode scanner via Zebra DataWedge.

Listens for scan results using a BroadcastReceiver, manages DataWedge profiles, and exposes controls for the scanner and flashlight — all through a simple Dart API.

Platform support

Android

Requires a Zebra device with DataWedge installed (pre-installed on all Zebra TC/MC/EC series devices).

Getting started

1. Add dependency

dependencies:
  zebra_tc: ^1.0.0

2. Create a DataWedge profile

Call createProfile() once on app start (e.g. in initState). DataWedge uses CREATE_IF_NOT_EXIST logic — safe to call on every launch.

final zebra = ZebraTc();

@override
void initState() {
  super.initState();
  zebra.createProfile('MyAppProfile');
}

This automatically:

  • Creates a DataWedge profile linked to your app's package
  • Enables the Barcode plugin with scanner_selection: auto
  • Configures Intent output with broadcast delivery to com.zebratc.zebra_tc.SCAN

Usage

Listen for scan results

scanStream registers a BroadcastReceiver on first listen and unregisters it on cancel. Use a StreamSubscription and cancel it in dispose.

StreamSubscription<ZebraScan>? _sub;

void startListening() {
  _sub = zebra.scanStream.listen((scan) {
    print('Barcode: ${scan.barcode}');
    print('Symbology: ${scan.symbology}');
  });
}

@override
void dispose() {
  _sub?.cancel();
  super.dispose();
}

ZebraScan fields:

Field Type Description
barcode String Decoded barcode value
symbology String Barcode type (e.g. LABEL-TYPE-EAN128, LABEL-TYPE-QRCODE)

Enable / disable scanner

await zebra.enableScanner();   // RESUME_PLUGIN
await zebra.disableScanner();  // SUSPEND_PLUGIN

Soft scan trigger

Programmatically trigger the scanner as if the physical button was pressed:

await zebra.startScan();  // START_SCANNING
await zebra.stopScan();   // STOP_SCANNING

Flashlight (torch)

await zebra.setFlash(enabled: true);   // torch on
await zebra.setFlash(enabled: false);  // torch off

Note: flashlight availability depends on the device model and DataWedge version.

API reference

class ZebraTc {
  Stream<ZebraScan> get scanStream;
  Future<void> createProfile(String name);
  Future<void> enableScanner();
  Future<void> disableScanner();
  Future<void> startScan();
  Future<void> stopScan();
  Future<void> setFlash({required bool enabled});
}

How it works

  1. createProfile() sends DataWedge API intents to create a profile and bind it to your app's package name.
  2. DataWedge broadcasts scan results as intents with action com.zebratc.zebra_tc.SCAN.
  3. The plugin registers a BroadcastReceiver when scanStream is listened to, parses the intent extras, and emits ZebraScan objects to the Dart stream.
  4. The receiver is automatically unregistered when the stream subscription is cancelled.

Requirements

  • Android SDK 24+
  • Zebra device with DataWedge (TC20, TC21, TC25, TC26, TC51, TC52, TC57, TC70, TC72, TC77, MC series, etc.)
  • DataWedge 6.4+ recommended

Libraries

zebra_tc