thermal_printer_billbay 1.0.7
thermal_printer_billbay: ^1.0.7 copied to clipboard
A comprehensive Flutter plugin for ESC/POS thermal printers via Bluetooth Classic (SPP). Supports Arabic shaping, multiple code pages, receipt templates, images, QR codes, barcodes, and all standard E [...]
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:thermal_printer_billbay/thermal_printer_billbay.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(home: PrinterDemo());
}
}
class PrinterDemo extends StatefulWidget {
const PrinterDemo({super.key});
@override
State<PrinterDemo> createState() => _PrinterDemoState();
}
class _PrinterDemoState extends State<PrinterDemo> {
final _printer = ThermalPrinterManager();
List<BluetoothDevice> _devices = [];
bool _connected = false;
String _status = 'Not connected';
@override
void initState() {
super.initState();
_printer.connectionState.listen((connected) {
setState(() {
_connected = connected;
_status = connected ? 'Connected' : 'Disconnected';
});
});
}
Future<void> _setup() async {
setState(() => _status = 'Setting up...');
final ready = await _printer.ensureReady();
if (!ready) {
setState(() => _status = 'Permissions denied or Bluetooth off');
return;
}
final devices = await _printer.getBondedDevices();
setState(() {
_devices = devices;
_status = 'Found ${devices.length} paired devices';
});
}
Future<void> _connect(BluetoothDevice device) async {
setState(() => _status = 'Connecting to ${device.name}...');
final ok = await _printer.connectWithRetry(device.address);
setState(() => _status = ok ? 'Connected to ${device.name}' : 'Connection failed');
}
Future<void> _printTest() async {
if (!_connected) return;
final cmd = EscPosCommands(PaperSize.mm80);
cmd.initialize();
cmd.textStyled(
'TEST PRINT',
PosStyles(align: PrintAlign.center, bold: true, width: 2, height: 2),
useLatin: true,
);
cmd.hr();
cmd.textLn('Hello from thermal_printer_billbay!', useLatin: true);
cmd.leftRight('Date:', DateTime.now().toString().substring(0, 16), useLatin: true);
cmd.hr();
cmd.printQrCode('https://pub.dev/packages/thermal_printer_billbay', size: 6);
cmd.feedAndCut();
await _printer.sendBytes(cmd.getBytes());
setState(() => _status = 'Print sent!');
}
@override
void dispose() {
_printer.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Thermal Printer Demo')),
body: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text('Status: $_status', style: const TextStyle(fontSize: 16)),
const SizedBox(height: 16),
ElevatedButton(
onPressed: _setup,
child: const Text('Setup (Permissions + Scan)'),
),
const SizedBox(height: 8),
Expanded(
child: ListView.builder(
itemCount: _devices.length,
itemBuilder: (context, index) {
final device = _devices[index];
return ListTile(
title: Text(device.name),
subtitle: Text(device.address),
onTap: () => _connect(device),
);
},
),
),
ElevatedButton(
onPressed: _connected ? _printTest : null,
child: const Text('Print Test Page'),
),
],
),
),
);
}
}